回答:
この方法を試してください:
y=$(echo $x | awk '{print $2}')
echo $y
echo $x
の値を表示しますx
。awk '{print $2}'
以前に表示されたの2番目のフィールドを印刷しますx
。$(
... )
出力を保持し、それをに割り当てy
ます。echo $x
されていない の値を表示しますx
。printf '%s\n' "$x"
だろう。
awk '{print $2}'
以前に表示された各行の2番目のフィールドを印刷しますx
。
抽出する部分文字列の前にスペースが少なくとも1つある(そして、部分文字列にスペースが含まれていない)と仮定すると、単純なパラメーター展開でこれを行うことができます。
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
出力
[true]
echo
で-
始まらず、エスケープシーケンスを含まないリテラル文字列以外には移植できません。その動作は、それがどのようにコンパイルされたか、およびXPG_ECHO
が設定されているかどうかによって、bash組み込みの場合でも異なります。文字列にエスケープシーケンスが含まれていないと仮定すると、これは問題ないはずですが、printf '[%s]\n' "$y"
それでも優れています。
echo
」の例でも、変数の値を表示するために使用する習慣を本当に破るべきです。
あなたはawkを使うことができます:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF
現在のレコードのフィールド数
sedの使用:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
文字列式を使用:
a="rtcpOnNbActive true"
echo ${a##* }
true
grepを使用:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-oは完全一致のみを提供し[a-z]+
、azからの文字に一致し、$
最後に意味します
echo
で-
始まらず、エスケープシーケンスを含まないリテラル文字列以外には移植できません。その動作は、それがどのようにコンパイルされたか、およびXPG_ECHO
が設定されているかどうかによって、bash組み込みの場合でも異なります。また、変数の展開とコマンドの置換は常に二重引用符で囲む必要があります(特定の例外はありますが、必要ない場合でも害はありません)。OPのような文字列の場合、これは問題ないはずですが、確認しprintf '%s\n' "${a##* }"
たい場合はより良いでしょう。
あなたは使用することができread
ビルトインを
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
ですか?それはread
分割を行うものではありません-それはそうです$IFS
。何らかの理由で、多くの人が関与している場合に$IFS
のみ w /を分割しても問題ないと考えてread
います。あなたはただ行うことができます:set -f; IFS=' '; printf %.0s%s $x
または何でも。いずれにせよ- $IFS
ここでの値を指定する必要があります。
read
割り当て、$IFS
分割。配列にデータを入力する場合は、次を使用しset
ます。その場合、ここでは人工的なhere-stringナンセンスは必要ありません。unset IFS
デフォルトの$ IFS動作を取得します。
x
抽出する部分文字列の直前に常にスペースがありますか?