Как получить последний символ строки в оболочке?

Я написал следующие строки, чтобы получить последний символ строки:

str=$1
i=$((${#str}-1))
echo ${str:$i:1}

Это работает для abcd/:

$ bash last_ch.sh abcd/
/

Это не работает для abcd*:

$ bash last_ch.sh abcd*
array.sh assign.sh date.sh dict.sh full_path.sh last_ch.sh

В нем перечислены файлы в текущей папке.

Ответ 1

Это одна из причин, почему вам нужно заключить в кавычки ваши переменные:

echo "${str:$i:1}"

В противном случае, bash расширяет переменную и в этом случае выполняет сглаживание перед печатью. Также лучше указать параметр в сценарии (если у вас есть подходящее имя файла):

sh lash_ch.sh 'abcde*'

Также см. Порядок расширений в справочном руководстве bash. Переменные раскрываются перед расширением имени файла.

Чтобы получить последний символ, вы должны просто использовать -1 в качестве индекса, поскольку отрицательные индексы отсчитываются от конца строки:

echo "${str: -1}"

Ответ 2

Per @perreal, цитирующие переменные важны, но потому, что я прочитал этот пост, как 5 раз, прежде чем найти более простой подход к вопросу под рукой в ​​комментариях...

str='abcd/'
echo "${str: -1}"

Выход: /

str='abcd*'
echo "${str: -1}"

Выход: *

Спасибо всем, кто участвовал в этом выше; Я правильно добавил +1 по всему потоку!

Ответ 3

Я знаю, что это очень старая нить, но никто не упомянул, что для меня самый чистый ответ:

echo -n $str | tail -c 1

Обратите внимание, что -n просто так, что эхо не включает в себя новую строку в конце.

Ответ 5

Одиночная строка:

${str:${#str}-1:1}

Сейчас:

echo "${str:${#str}-1:1}"

Ответ 6

Каждый ответ до сих пор подразумевает, что слово "оболочка" в вопросе равно Bash.

Вот как это можно сделать в стандартной оболочке Bourne:

printf $str | tail -c 1

Ответ 7

другое решение с использованием awk script:

last 1 char:

echo $str | awk '{print substr($0,length,1)}'

последние 5 символов:

echo $str | awk '{print substr($0,length-5,5)}'

Ответ 8

echo $str | cut -c $((${#str}))

- хороший подход