Как получить последний символ строки в оболочке?
Я написал следующие строки, чтобы получить последний символ строки:
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
просто так, что эхо не включает в себя новую строку в конце.
Ответ 4
Try:
"${str:$((${#str}-1)):1}"
Например,
[email protected]:~$ str="A random string*"; echo "$str"
A random string*
[email protected]:~$ echo "${str:$((${#str}-1)):1}"
*
[email protected]:~$ echo "${str:$((${#str}-2)):1}"
g
Ответ 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}))
- хороший подход