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

88

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

word="tiger"

Или:

word="This is a sentence."

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

echo $firstletter
t

Или:

echo $firstletter
T
Деревня
источник

Ответы:

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

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

Thiton
источник
8
Обратите внимание, что -cв заголовке POSIX нет опции: < unix.com/man-page/posix/1/head >.
gioele
9
Это действительно возвращает первую букву, но это перебор, и решение зависит от внешних утилит (голова). Это можно сделать в чистой оболочке, которая будет чище.
automatthias 07
26
Этот ответ не должен быть принятым по причинам, указанным в приведенных выше комментариях. Настоящие ответы ниже - ${word:0:1}или ${word::1}.
noamtm
Для соответствия требованиям POSIX вы могли бы сделать echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"или , printf '%c' "$X"но это все подчинено одной ст. Мульти проделки байт символов.
phicr 01
Подожди, да head -c n, упс. echo "fábio" | head -c 2дает f� , так что это еще одна проблема, я думаю.
phicr 01
281
word="tiger"
firstletter=${word:0:1}
Кароли Хорват
источник
9
Именно то, что я искал. Однострочный, без порождения подоболочек. Примите мой голос!
Тихомир Митков
73
word=something
first=${word::1}
Адам Лисс
источник
1
Это было бы замечательно, но у меня не работает ни в bash 4.3.11, ни в zsh 5.0.5
yoniLavi
1
В GNU bash v4.3.11 firstустанавливается буква s. Вы можете увидеть это с помощью echo $s. Если это не сработает для вас и вам нужна помощь в отладке, скопируйте и вставьте набранные вами команды и их вывод.
Adam Liss
2
Спасибо, Адам, плохо, я не могу понять, почему у меня это не сработало раньше, но теперь оно отлично работает на нескольких версиях bash, которые я пробовал, возвращаясь к GNU bash, v3.1.0. По-прежнему не работает в zsh, но вопрос помечен как «bash», так что это не имеет значения.
yoniLavi
Спасибо за отслеживание и подтверждение! Рад, что это работает на тебя.
Адам Лисс,
6

С вырезом:

word='tiger'
echo "${word}" | cut -c 1
Franckyz
источник
2

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

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

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

{

  • s: начать процедуру замены
    • /: Начните указывать, что нужно заменить
    • ^\(.\): захватить первого персонажа в группе 1
    • .*:, убедитесь, что остальная часть строки будет в замене
    • /: начать указывать замену
    • \1: вставить группу 1
    • /: Остальное отбрасывается;
  • q: Выйти, sedчтобы не повторять этот блок для других строк, если они есть.

}

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

фикр
источник
1

Используя bash 4:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
Leogtzr
источник