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



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



str=
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


Это список файлов в текущей папке..

816   8  

8 ответов:

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

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

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

sh lash_ch.sh 'abcde*'

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

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

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

выход: /

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

выход: *

спасибо всем, кто участвовал в этом выше; я соответствующим образом добавил +1 по всему потоку!

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

echo -n $str | tail -c 1

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

другое решение с помощью awk script:

последний 1 знак:

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

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

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

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

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

printf $str | tail -c 1

попробуй:

"${str:$((${#str}-1)):1}"

, например:

someone@mypc:~$ str="A random string*"; echo "$str"
A random string*
someone@mypc:~$ echo "${str:$((${#str}-1)):1}"
*
someone@mypc:~$ echo "${str:$((${#str}-2)):1}"
g

одну строку:

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

теперь:

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

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

Comments

    Ничего не найдено.