Подтвердить что ты не робот

Попытка извлечь первые 5 символов из строки в ошибке bash?

Я пытаюсь получить первые 5 символов из строки, но продолжаю получать ошибку Bad substitution для строки манипуляции строкой, у меня есть следующие строки в моем teststring.sh script:

TESTSTRINGONE="MOTEST"

NEWTESTSTRING=${TESTSTRINGONE:0:5}
echo ${NEWTESTSTRING}

Я много раз использовал синтаксис и не мог видеть, что я делаю неправильно

Спасибо

4b9b3361

Ответ 1

В зависимости от вашей оболочки вы можете использовать следующий синтаксис:

expr substr $string $position $length

Итак, для вашего примера:

TESTSTRINGONE="MOTEST"
echo `expr substr ${TESTSTRINGONE} 0 5`

В качестве альтернативы

echo 'MOTEST' | cut -c1-5

или

echo 'MOTEST' | awk '{print substr($0,0,5)}'

Ответ 3

Здесь работает:

$ TESTSTRINGONE="MOTEST"
$ NEWTESTSTRING=${TESTSTRINGONE:0:5}
$ echo ${NEWTESTSTRING}
MOTES

Какую оболочку вы используете?

Ответ 4

Это может сработать для вас:

 printf "%.5s" $TESTSTRINGONE

Ответ 5

Подстроки с ${variablename:0:5} - это функция bash, недоступная в базовых оболочках. Вы уверены, что используете это под bash? Проверьте строку shebang (в начале script) и убедитесь, что она #!/bin/bash, а не #!/bin/sh.

Ответ 6

Работает в большинстве оболочек

TESTSTRINGONE="MOTEST"
NEWTESTSTRING=${TESTSTRINGONE%"${TESTSTRINGONE#?????}"}
echo ${NEWTESTSTRING}
# MOTES

Ответ 7

Вы можете попробовать sed, если хотите -

[jaypal:~/Temp] TESTSTRINGONE="MOTEST"
[jaypal:~/Temp] sed 's/\(.\{5\}\).*/\1/' <<< "$TESTSTRINGONE"
MOTES

Ответ 8

Это расширение параметра должно работать (какая версия bash у вас есть?)

Здесь другой подход:

read -n 5 NEWTESTSTRING <<< "$TESTSTRINGONE"

Ответ 9

echo $TESTSTRINGONE|awk '{print substr($0,0,5)}'

Ответ 10

Исходный синтаксис будет работать с BASH, но не с DASH. На дебианских системах вы может показаться, что вы используете bash, но, возможно, вместо них. Если/bin/dash/существует, тогда попробуйте временно переименовать тире на что-то вроде no.dash, а затем создайте мягкую link, aka ln -s/bin/ bash/bin/dash и посмотреть, устраняет ли это проблему.

Ответ 11

Вы были так близко! Вот самое простое решение: NEWTESTSTRING=$(echo ${TESTSTRINGONE::5})

Итак, для вашего примера:

$ TESTSTRINGONE="MOTEST"
$ NEWTESTSTRING=$(echo ${TESTSTRINGONE::5})
$ echo $NEWTESTSTRING
MOTES