2012-04-18 69 views
51

我有一个Bash的变量,$word,有时一个单词或句子,如:如何获取Bash变量中的第一个字母?

word="tiger" 

或者:

word="This is a sentence." 

我怎样才能让一个新的Bash变量等于只在变量中找到第一个字母?例如,上面的是:

echo $firstletter 
t 

或者:

echo $firstletter 
T 

回答

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

每次你说 “第一次” 在您的问题描述时,head是一个可能的解决方案。

+6

请注意,POSIX标题中没有'-c'选项:。 – gioele 2015-01-09 10:02:13

+3

这确实会返回第一个字母,但这是一个矫枉过正的问题,并且解决方案取决于外部实用程序(头部)。这可以在更纯净的纯壳体中完成。 – automatthias 2016-10-07 09:51:52

+10

这不应该是被接受的答案,因为上述评论指出的原因。真正的答案如下:'$ {word:0:1}'或'$ {word :: 1}'。 – noamtm 2016-12-08 07:37:16

170
word="tiger" 
firstletter=${word:0:1} 
+3

正是我在找的东西。单线,不产生子壳。拿我的投票! – 2015-06-25 14:54:34

58
word=something 
first=${word::1} 
+1

这将是美好的,但不适用于我,既不bash 4.3.11也不zsh 5.0.5 – yoniLavi 2016-03-29 16:59:56

+1

随着GNU bash v4.3.11,'first'被设置为字母's'。你可以用'echo $ s'来看它。如果这不适用于您,并且您希望帮助调试,请复制并粘贴您输入的命令及其输出。 – 2016-03-30 18:54:33

+1

感谢亚当,我的坏,我不明白为什么它不适合我以前,但它现在在我试过的几个版本的bash上完美地工作,回到GNU bash,v3.1.0。 仍然无法在zsh中工作,但问题被标记为“bash”,所以这是无关紧要的。 – yoniLavi 2016-03-31 01:37:36

1

既然你这里有一个sed标签是sed答案:

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

播放由游戏为那些谁喜欢那些(我做的!):

{

  • s:启动程序的替代
    • /:启动指定什么是要取代
    • ^\(.\):在第1组捕获的第一个字符
    • .*:,确保该行的其余部分将在替代
    • /:启动指定替换
    • \1:插入第1组
    • /:其余的被丢弃;
  • q:退出sed,所以它不会,如果有任何重复此块其他线路。

}

嗯,这很有趣! :)你也可以使用grep等,但如果你在bash${x:0:1} magick仍然是更好的解决方案imo。(我花了有一个小时试图使用POSIX变量扩展到这样做,但不能:(

+0

我在这里发布了POSIX解决方案:https://stackoverflow.com/a/44988512/4694621 – 2017-07-08 16:47:39

0

使用bash 4:

x="test" 
read -N 1 var <<< "${x}" 
echo "${var}" 
相关问题