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

У меня есть переменная Bash, $word, которая иногда является словом или предложением, например:

word="tiger"

Or:

word="This is a sentence."

Как я могу создать новую переменную Bash, которая равна только первой букве, найденной в переменной? Например, приведенное выше будет:

echo $firstletter
t

Or:

echo $firstletter
T

person Village    schedule 18.04.2012    source источник


Ответы (7)


initial="$(echo $word | head -c 1)"

Каждый раз, когда вы говорите «первый» в описании проблемы, head является вероятным решением.

person thiton    schedule 18.04.2012
comment
Обратите внимание, что в заголовке POSIX нет параметра -c: ‹unix.com/man -page/posix/1/head›. - person gioele; 09.01.2015
comment
Это возвращает первую букву, но это излишество, и решение зависит от внешних утилит (head). Это можно сделать в чистой оболочке, которая чище. - person automatthias; 07.10.2016
comment
Это не должен быть принятый ответ по причинам, указанным в приведенных выше комментариях. Реальные ответы ниже - ${word:0:1} или ${word::1}. - person noamtm; 08.12.2016
comment
Для соответствия POSIX вы можете использовать echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X" или printf '%c' "$X", но все они подлежат махинациям с одиночными и многобайтовыми символами. - person phicr; 01.03.2017
comment
Подожди, head -c n тоже, упс. echo "fábio" | head -c 2 дает f� , так что, я думаю, это еще одна проблема. - person phicr; 01.03.2017
comment
Чтобы обновить принятый ответ, потребуется @Villiage. Хочу? Сообщество будет вам благодарно... - person Daniel Farrell; 28.12.2019
comment
Это излишне, если вы хотите получить первый символ (символы) переменной bash. Это прекрасное решение, если вам нужен первый символ (символы) чего-либо еще независимо от вашей оболочки. Например. в сценарии, запущенном sh: date +%N | head -c 7. - person YSC; 08.10.2020

Портативный способ сделать это — использовать расширение параметра (которое является POSIX функция):

$ word='tiger'
$ echo "${word%"${word#?}"}"
t
person Mateusz Piotrowski    schedule 08.07.2017
comment
Более разумно использовать другие ответы с ::, но я не могу не проголосовать за такое злоупотребление расширением. Хорошо сделано. - person akostadinov; 20.05.2021

С вырезом:

word='tiger'
echo "${word}" | cut -c 1
person Franckyz    schedule 30.08.2018

Поскольку у вас есть тег sed, вот ответ sed:

echo "$word" | sed -e "{ s/^\(.\).*/\1/ ; q }"

Игра за игрой для тех, кому это нравится (мне нравится!):

{

  • s: start a substitution routine
    • /: Start specifying what is to be substituted
    • ^\(.\): захватить первый символ в группе 1
    • .*: убедитесь, что остальная часть строки будет в замене
    • /: начать указывать замену
    • \1: вставить группу 1
    • /: остальное отбрасывается;
  • q: Закройте sed, чтобы этот блок не повторялся для других строк, если они есть.

}

Что ж, это было весело! :) Вы также можете использовать grep и т. д., но если вы находитесь в bash, магия ${x:0:1} по-прежнему будет лучшим решением. (Я потратил около часа, пытаясь использовать расширение переменных POSIX, чтобы сделать это, но не смог :( )

person phicr    schedule 01.03.2017

Используя Баш 4:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
person leogtzr    schedule 22.10.2017

person    schedule
comment
Именно то, что я искал. Однострочный, без создания подоболочек. Возьми мой голос! - person Tihomir Mitkov; 25.06.2015

person    schedule
comment
Это было бы замечательно, но у меня не работает ни в bash 4.3.11, ни в zsh 5.0.5 - person yoniLavi; 29.03.2016
comment
В GNU bash v4.3.11 first заменяется на букву s. Вы можете увидеть это с помощью echo $s. Если это не работает для вас, и вам нужна помощь в отладке, скопируйте и вставьте введенные вами команды и их вывод. - person Adam Liss; 30.03.2016
comment
Спасибо, Адам, мой плохой, я не могу понять, почему он не работал у меня раньше, но теперь он отлично работает на нескольких версиях bash, которые я пробовал, возвращаясь к GNU bash, v3.1.0. Все еще не работает в zsh, но вопрос помечен как bash, так что это не имеет значения. - person yoniLavi; 31.03.2016
comment
Спасибо за внимание и подтверждение! Рад, что это работает для вас. - person Adam Liss; 01.04.2016
comment
Для пользователей zsh: работает с ${word:0:1} - person luator; 10.06.2021