シェルスクリプトで条件を使用する方法

シェルスクリプトで条件を使用する方法

ifスクリプトにステートメントがあります。

次のようになります。

if [ "$a" != "0" -a "$b" != "100" ]; then
 #some commands here

私が正しく覚えている場合、両方の条件が真であれば、上記の行が機能します。

今どのようにテストしますか?誰でもどちらも真になる前に1つまたは両方の条件を実行しますかsome commands

ベストアンサー1

標準(POSIX shおよびユーティリティ)でこれを指定する明確な方法は次のとおりです。

  • ひも比較する:

    if [ "$a" != 0 ] || [ "$b" != 100 ]; then...
    
  • 10進数比較してください(0100は100ですが、先行スペースが無視されるかどうかは実装によって異なります)。

    if [ "$a" -ne 0 ] || [ "$b" -ne 100 ]; then...
    
  • 整数比較してください(0x64、0144は100です(一部のシェルは8進数に対してPOSIXモードを有効にする必要があります)。RANDOMしたがって、シェル100.0、1e2、50 + 50...によると(0.003%の場合)...):

    if [ "$((a != 0 || b != 100))" -ne 0 ]; then...
    

    ただし、変数の内容が構文エラーのため算術拡張に失敗するとシェルがクラッシュするため、この問題を解決するにはサブシェルで実行する必要があります。

    if ([ "$((a != 0 || b != 100))" -ne 0 ]); then
    

    変数の内容を制御できない場合は、この形式を使用しないでください。一つ任意コマンド実行の脆弱性数多くの樹皮の中からbash、、、kshzsh(例えば、$aのような値x[$(reboot)])。

どちらを選択するかは、変数の内容と目的の内容によって異なります。標準形式の10進整数が含まれていることがわかっている場合、3つすべて同じです。

それにもかかわらず-a/-o test演算子を使用しないでください。一般的に廃止され、信頼できない(変数の内容を制御できる場合はここではありません。)

おすすめ記事