2012-04-18 72 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}" 
相關問題