如何获取Bash变量中的第一个字母?


88

我有一个Bash变量,$word有时是一个单词或句子,例如:

word="tiger"

要么:

word="This is a sentence."

如何制作一个新的Bash变量,该变量仅等于该变量中找到的第一个字母?例如,上面是:

echo $firstletter
t

要么:

echo $firstletter
T

Answers:


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

每次在问题描述中说“第一”head都是一种可能的解决方案。


8
请注意,-cPOSIX头中没有任何选项:< unix.com/man-page/posix/1/head >。
gioele 2015年

9
这确实返回了第一个字母,但这是一个过大的问题,解决方案取决于外部实用程序(头)。这可以在更干净的纯壳中完成。
automatthias 16-10-7

26
由于上述评论指出的原因,这不应是可接受的答案。实际答案在-${word:0:1}或以下${word::1}
noamtm

POSIX标准,你可以做echo "$word" | fold -w1 | head -n 1printf '%.1s' "$X"printf '%c' "$X"但这些都是受单一诉多字节字符有心计。
phicr

等一下head -c n,哎呀。 echo "fábio" | head -c 2f� ,所以我猜这是另一个问题。
phicr


72
word=something
first=${word::1}

1
这将是很棒的,但对我不起作用,无论是在bash 4.3.11中还是在zsh 5.0.5中均
不起作用

1
在GNU bash v4.3.11中,first设置为letter s。您可以通过看到它echo $s。如果这对您不起作用,并且您需要调试帮助,请复制并粘贴您键入的命令及其输出。
亚当·利斯

2
谢谢亚当,我不好,我以前弄不明白为什么它对我不起作用,但是现在它在我尝试过的多个bash版本上都可以正常工作,回到GNU bash v3.1.0。仍然不能在zsh中使用,但是该问题被标记为“ bash”,因此无关紧要。
yoniLavi '16

感谢您的跟进和确认!很高兴为您工作。
亚当·利斯



2

由于您具有sed标签,因此这里是一个sed答案:

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

为喜欢这些游戏的人玩(我喜欢!):

{

  • s:启动替换例程
    • /:开始指定要替换的内容
    • ^\(.\):捕获组1中的第一个字符
    • .*:,确保该行的其余部分将在替换中
    • /:开始指定替换
    • \1:插入组1
    • /:其余部分将被丢弃;
  • q:请退出,sed这样就不会在其他行中重复此块。

}

好吧,这很有趣!:)您也可以使用grep和等,但如果你是bash${x:0:1}magick仍是更好的解决方案海事组织。(我花了一个小时的时间尝试使用POSIX变量扩展来做到这一点,但无法完成:(


1

使用bash 4:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.