回答:
この方法を試してください:
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抽出する部分文字列の直前に常にスペースがありますか?