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

109

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

word="tiger"

或者:

word="This is a sentence."

如何创建一个新的Bash变量,该变量仅等于在原变量中找到的第一个字母?例如,上述内容将是:
echo $firstletter
t

或者:

echo $firstletter
T
7个回答

347
word="tiger"
firstletter=${word:0:1}

12
正是我想要的。一行代码,不需要生成子 shell。投我的一票! - Tihomir Mitkov

93
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
谢谢Adam,我的错,我不知道为什么之前它对我不起作用,但现在在我尝试的几个版本的bash上都可以完美地工作,回到GNU bash,v3.1.0。 在zsh中仍然无法工作,但问题标记为“bash”,所以这是无关紧要的。 - yoniLavi
感谢您的跟进和确认!很高兴它对您有用。 - Adam Liss
1
对于zsh用户:它可以使用${word:0:1}函数工作。 - luator

46
initial="$(echo $word | head -c 1)"
每次在问题描述中提到“第一个”,head很可能是解决方案。

8
请注意,POSIX的head命令中没有“-c”选项:http://www.unix.com/man-page/posix/1/head。 - gioele
12
这会返回第一个字母,但这有点过度,而且需要依赖外部工具(head)。可以用纯shell实现,更加简洁。 - automaciej
30
由于上面的评论所指出的原因,这不应该被接受为答案。真正的答案在下面 - ${word:0:1}${word::1} - noamtm
1
为了符合POSIX标准,您可以使用以下命令:echo "$word" | fold -w1 | head -n 1printf '%.1s' "$X"printf '%c' "$X"。但是这些命令都可能受到单字节和多字节字符的影响。 - phicr
1
更新被接受的答案需要一个@Villiage。想要吗?社区会感激你的... - erik258
显示剩余2条评论

17

一种可以移植的方法是使用参数扩展(这是POSIX特性):(链接)

$ word='tiger'
$ echo "${word%"${word#?}"}"
t

更合理的做法是使用其他带有::的答案,但我不能错过这样一个扩展的滥用而不点赞。干得好。 - akostadinov
通常情况下,在强制使用 POSIX sh 而不是 bash 的脚本环境中,您需要进行外壳调用(shell out)(尽管这不是问题的一部分)。 - usretc

7

裁剪后:

word='tiger'
echo "${word}" | cut -c 1

2

既然您在这里使用了sed标签,这里给出一个sed的答案:

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

以下是针对喜欢打字的人(我就是!)的详细步骤:

{

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

好玩吧!:) 如果您在使用 bash ,您也可以使用 grep 等工具,但是在我看来,${x:0:1} 的魔法仍然是更好的解决方案。 (我花了大约一个小时尝试使用 POSIX 变量扩展来做到这一点,但是没成功 :(


1
使用bash 4:
x="test"
read -N 1 var <<< "${x}"
echo "${var}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接