次を出力するbashスクリプトがあります。
SUM = 137892134.0000000
文字列の最初の部分を取り除き、数値だけを残して、可能であれば整数としてフォーマットする必要があります。使用する必要sed
があると思いますが、それを習得する能力がゼロのようです。
値が 100 未満の場合に動作する条件ステートメントを記述できるようにする必要があります。bash スクリプトでこれを実行できるかどうかはわかりませんが、それは私の課題の 2 番目の部分になります。
sedによる置換の基本的な形式は次のとおりです。
s/replace this/with this/
ここで、「これを置き換える」と「これを使用する」はどちらも正規表現です。あなたの場合、最初のリテラル文字列「SUM=」と最後の小数を完全に削除したいとします。それで:
#!/bin/bash
sum=$(your_script.sh | sed 's/^SUM = //' | sed 's/\..*//')
if ! egrep -q '^[0-9]+$' <<< $sum; then
echo "your_script.sh printed unexpected output!"
exit 1
fi
if [ $sum -lt 100 ]; then
echo "$sum is less than 100"
else
echo "$sum is not less than 100"
fi
最初の行は、「SUM=137892134.0000000」を「137892134」に変換するものです。最初のsedは、文字列()の先頭にある「SUM =」^
を何も置き換えません(つまり、削除します)。2番目のsedは、最初のピリオド文字(\.
)を見つけて、それ以降のすべての文字().*
を何も置き換えません。$sum
結果の文字列は、を使用して変数に保存されます$(...)
。
$sum
egrepを使用するifステートメントは、保存した値が実際に整数であることを確認し、そうでない場合はベイルします。
2番目のifステートメントは、整数であることがわかっている$sumの値を100と比較します。
「123.789」をどのように処理したいか(整数として印刷するときに124または123を印刷するかどうか)は明確ではありません。検討:
if $( echo SUM = 137892134.0000000 | awk '{printf "%d", $3}' ) -lt 100; then
echo the value is less than 100!!
fi
次のこともできます。
if echo SUM = 137892134.0000000 | awk '$3 >= 100 { exit 1}'; then
echo the value is less than 100!!
fi
また
if ! echo SUM = 137892134.0000000 | awk '{exit $3 < 100}'; then
echo the value is less than 100!!
fi
1を返すと失敗と評価されるため、ロジックは少し複雑であることに注意してください。そのawk
ため、比較演算子は予想されるものの逆になります。
sed
これを行うために使用する 1 つの方法を次に示します。
echo 'SUM = 137892134.0000000' | sed 's/[^0-9.]//g' | sed 's/\..*//g'
出力は次のようになります137892134
。
コマンドに関するいくつかの説明:
sed 's/[^0-9.]//g'
数字 ( - ) またはピリオド ( )sed
以外の文字を削除するように指示します。0
9
.
sed 's/\..*//g'
小数点以下 ( ) の後の文字 ( )をsed
削除するように指示します。.*
\.
また、を使用する代わりにecho
、元のスクリプトからの出力を最初の部分に使用できます...そしてsed
、最終的に必要な「int」を取得するためにパイプすることができます。
注: これは、William Pursell によって提起された丸めの問題を考慮していません。
私は提案します:
bashScript | sed 's/.* \(.*\)\.0*/\1/'
英語で:「たくさんのもの、スペース、何か、ドット、そしておそらくいくつかのゼロを取り、それらすべてを何かに置き換えてください。」