我有一个Bash的变量,$word
,有时一个单词或句子,如:如何获取Bash变量中的第一个字母?
word="tiger"
或者:
word="This is a sentence."
我怎样才能让一个新的Bash变量等于只在变量中找到第一个字母?例如,上面的是:
echo $firstletter
t
或者:
echo $firstletter
T
我有一个Bash的变量,$word
,有时一个单词或句子,如:如何获取Bash变量中的第一个字母?
word="tiger"
或者:
word="This is a sentence."
我怎样才能让一个新的Bash变量等于只在变量中找到第一个字母?例如,上面的是:
echo $firstletter
t
或者:
echo $firstletter
T
initial="$(echo $word | head -c 1)"
每次你说 “第一次” 在您的问题描述时,head
是一个可能的解决方案。
word="tiger"
firstletter=${word:0:1}
正是我在找的东西。单线,不产生子壳。拿我的投票! – 2015-06-25 14:54:34
word=something
first=${word::1}
这将是美好的,但不适用于我,既不bash 4.3.11也不zsh 5.0.5 – yoniLavi 2016-03-29 16:59:56
随着GNU bash v4.3.11,'first'被设置为字母's'。你可以用'echo $ s'来看它。如果这不适用于您,并且您希望帮助调试,请复制并粘贴您输入的命令及其输出。 – 2016-03-30 18:54:33
感谢亚当,我的坏,我不明白为什么它不适合我以前,但它现在在我试过的几个版本的bash上完美地工作,回到GNU bash,v3.1.0。 仍然无法在zsh中工作,但问题被标记为“bash”,所以这是无关紧要的。 – yoniLavi 2016-03-31 01:37:36
既然你这里有一个sed
标签是sed
答案:
echo "$word" | sed -e "{ s/^\(.\).*/\1/ ; q }"
播放由游戏为那些谁喜欢那些(我做的!):
{
s
:启动程序的替代
/
:启动指定什么是要取代^\(.\)
:在第1组捕获的第一个字符.*
:,确保该行的其余部分将在替代/
:启动指定替换\1
:插入第1组/
:其余的被丢弃;
q
:退出sed
,所以它不会,如果有任何重复此块其他线路。}
嗯,这很有趣! :)
你也可以使用grep
等,但如果你在bash
${x:0:1}
magick仍然是更好的解决方案imo。(我花了有一个小时试图使用POSIX变量扩展到这样做,但不能:(
)
我在这里发布了POSIX解决方案:https://stackoverflow.com/a/44988512/4694621 – 2017-07-08 16:47:39
的便携式办法做到这一点是使用parameter expansion (which is a POSIX feature):
word='tiger'
first="${word%%"${word#?}"}"
使用bash 4:
x="test"
read -N 1 var <<< "${x}"
echo "${var}"
请注意,POSIX标题中没有'-c'选项:。 –
gioele
2015-01-09 10:02:13
这确实会返回第一个字母,但这是一个矫枉过正的问题,并且解决方案取决于外部实用程序(头部)。这可以在更纯净的纯壳体中完成。 – automatthias 2016-10-07 09:51:52
这不应该是被接受的答案,因为上述评论指出的原因。真正的答案如下:'$ {word:0:1}'或'$ {word :: 1}'。 – noamtm 2016-12-08 07:37:16