Это одна из причин, по которой вам нужно указывать переменные в кавычках:
echo "${str:$i:1}"
В противном случае bash расширяет переменную и в этом случае выполняет подстановку перед выводом на печать. Также лучше указать параметр скрипта в кавычках (если у вас есть совпадающее имя файла):
sh lash_ch.sh 'abcde*'
Также см. Порядок расширений в справочном руководстве по bash . Переменные раскрываются перед расширением имени файла.
Чтобы получить последний символ, вы должны просто использовать его -1
как индекс, так как отрицательные индексы отсчитываются от конца строки:
echo "${str: -1}"
Пробел после двоеточия ( :
) НЕОБХОДИМ.
Такой подход не будет работать без места.
"${1: -1}"
что достаточно.echo "${str:$((${#str}-1)):1}"
. Это также позволяет вам изменять возвращаемые завершающие символы. Эта работа для меня в bash v4.1.0 (1)"${1:-1}
Per @perreal, цитирование переменных важно, но поскольку я прочитал этот пост примерно 5 раз, прежде чем найти более простой подход к рассматриваемому вопросу в комментариях ...
Вывод:
/
Вывод:
*
Спасибо всем, кто участвовал в этом выше; Я правильно добавил +1 по всей цепочке!
источник
${std: -1}
, без него не получится. Я столкнулся с этим и обнаружил, что это${std:~0}
тоже работает (с пробелом или без него). Не уверен, что это задокументированное поведение, но я не стал его искать..sh
сценарии при попытке присвоить извлеченный символ переменной. Например,declare LAST=$(echo "${str: -1}")
это приведет к появлению неприятной красной полосы с синтаксической ошибкой, начиная с:${str:0-1}
Я знаю, что это очень старая ветка, но никто не упомянул, какой для меня самый чистый ответ:
Обратите внимание, что
-n
это просто так, что эхо не включает новую строку в конце.источник
другое решение с использованием сценария awk:
последний 1 символ:
последние 5 символов:
источник
cat file | awk '{print substr($0,length,1)}'
Спасибо!До сих пор каждый ответ подразумевает, что слово «оболочка» в вопросе приравнивается к Bash.
Вот как это можно сделать в стандартной оболочке Bourne:
источник
echo -n
по предложению user5394399 позволяет избежать проблем, если он$str
содержит символы специального формата.-n
Переключатель является bashism. Это не будет работать в стандартной оболочке Bourne в виде тире и т. Д. Это был смысл моего ответа.printf "%s" "$str" | ...
:-).Одна линия:
Сейчас:
источник
echo "${str: -1}"
достаточно (обратите внимание на пробел между:
и-
).$((...))
.Пытаться:
Например:
источник
это хороший подход
источник