Bash変数の最初の文字を取得するにはどうすればよいですか?


88

私はBash変数を持っています、 $wordこれは時々単語や文です。例:

word="tiger"

または:

word="This is a sentence."

変数にある最初の文字だけに等しい新しいBash変数を作成するにはどうすればよいですか?たとえば、上記は次のようになります。

echo $firstletter
t

または:

echo $firstletter
T

回答:


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

問題の説明で「最初に」と言うたびに、head解決策になる可能性があります。


8
-cPOSIXヘッドにはオプションがないことに注意してください:< unix.com/man-page/posix/1/head >。
gioele 2015年

9
これは最初の文字を返しますが、それはやり過ぎであり、解決策は外部ユーティリティ(ヘッド)に依存します。これは、よりクリーンな純粋なシェルで実行できます。
automatthias 2016年

26
上記のコメントで指摘されている理由により、これは受け入れられる答えではありません。本当の答えは以下のとおりです-${word:0:1}または${word::1}
noamtm 2016

POSIX準拠のためにあなたが行うことができecho "$word" | fold -w1 | head -n 1printf '%.1s' "$X"またはprintf '%c' "$X"これらは、すべてのシングルVの対象となっている。マルチバイト文字ペテン。
phicr 2017年

待ってください、そうですhead -c n、おっと。 echo "fábio" | head -c 2を与えるf� ので、これは別の問題だと思います。
phicr 2017年


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

1
これは素晴らしいことですが、bash4.3.11でもzsh5.0.5でも機能しません
yoniLavi 2016年

1
GNU bash v4.3.11ではfirst、文字に設定されsます。あなたはそれをで見ることができますecho $s。それでも問題が解決せず、デバッグのサポートが必要な場合は、入力したコマンドとその出力をコピーして貼り付けてください。
Adam Liss 2016年

2
アダムに感謝します。私の悪い人です。以前はうまくいかなかった理由がわかりませんが、GNU bash v3.1.0に戻って、試したいくつかのバージョンのbashで完全に正常に機能するようになりました。それでもzshでは機能しませんが、質問には「bash」というタグが付けられているため、関係ありません。
yoniLavi 2016年

フォローアップと確認をありがとう!それがあなたのために働いていることをうれしく思います。
Adam Liss 2016



2

sedここにタグがあるので、sed答えは次のとおりです。

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

それらを楽しむ人のために遊びごとに遊ぶ(私はそうする!):

{

  • s:置換ルーチンを開始します
    • /:何を置き換えるかを指定し始める
    • ^\(.\):グループ1の最初のキャラクターをキャプチャします
    • .*:、行の残りの部分が置換されることを確認してください
    • /:置換の指定を開始します
    • \1:グループ1を挿入
    • /:残りは破棄されます;
  • q:終了しsedて、他の行がある場合にこのブロックが繰り返されないようにします。

}

楽しかったです!などを:)使用することもgrepできますがbash${x:0:1}魔術を使用している場合でも、より優れたソリューションimoです。(私はそれを行うためにPOSIX変数拡張を使用しようとして1時間ほど費やしましたが、できませんでした:(


1

bash 4の使用:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.