2017-04-16 9 views
0

こんにちは私は3つの条件を満たす必要のあるbashスクリプトをチェックしようとしています。しかし、私が& &オペレータを使っていくつかの算術を使って3番目のチェックを実装したいとき、スクリプトは起動されません。Bashのif文で算術演算を使用する方法

DOUBLE_CHECK=0 

if [[ -z "$avail" && "$WIFI_ID" == "some_str" && 'expr $DOUBLE_CHECK % 2' -eq "0"]]; then 
     sudo caffeinate xterm -geometry 70x20+0+0 -fa monospace -fs 8 -e './script1.sh' & disown 

fi 
(($DOUBLE_CHECK++)) 

アイデアは、それがif文

答えて

1

、あなたはこのように、内部コマンドの出力に式を展開する、好ましく$()をバッククォートを使用するか、または可能性:

if [[ -z "$avail" && $WIFI_ID == "some_str" && $(expr $DOUBLE_CHECK % 2) -eq "0" ]] 

私は(必要な)スペースを追加していますのでご注意ください最後の]]の前に二重括弧の条件式は、通常のコマンドではありません、それは特別なシェルの構文であり、それ:私は無害が、不要な引用符を削除しているのでご注意ください

if [[ -z $avail && $WIFI_ID == "some_str" ]] && ((DOUBLE_CHECK % 2 == 0)) 

別の可能性は、算術式を使用することです単語分割を実行しません。 some_strの前後に引用符を残しました。これは、引用符で囲まれていない場合、等価/不等式の比較が右側の式でパターンマッチングを実行するためです。算術式の変数名の前には$もありません。それは動作しますが、(())または$(())の内部では必要ありません。

発現はまた、のように表すことができ:

if [[ -z $avail && $WIFI_ID == "some_str" ]] && ! ((DOUBLE_CHECK % 2)) 

この理由は(())は、さもなければ、その数値結果が非ゼロである場合0の戻りコードを有し、非ゼロの戻りコードということです。

0

の第三条件を渡し、私はそれが2で割り切れるときはいつでも、第三のチェックは、その後にチェック私のwhileループ内で時間をかけて増分番号を持ってしたいですいくつか小さな問題があります

  1. 3つ目の条件は、引用符ではなくバックティック( '' ')で評価する必要があります。 bash内の一重引用符は文字列リテラルを意味します。だから、'expr $DOUBLE_CHECK %2' -eq "0"常にチェック-eqが数字を比較するために使用される

  2. falseになります。あなたの文は、文字列のロジック(===が同等である)と((...))ため[[ .. ]]を使用することができます(文字列を比較するために、通常の==構文を使用)文字列を使用して

てみてください、

DOUBLE_CHECK=0 

if [[ -z "$avail" ]] && [[ "$WIFI_ID" == "some_str" ]] && [[ `expr $DOUBLE_CHECK % 2` -eq 0 ]]; then 
     sudo caffeinate xterm -geometry 70x20+0+0 -fa monospace -fs 8 -e './script1.sh' & disown 

fi 
(($DOUBLE_CHECK++)) 
+1

#3の推奨が有効ではないと思います。 Bashの条件は論理演算子をサポートしていますが、標準の '['テストで '-a'や' -o'とは異なります。 – Fred

+0

'[[" A "==" A "]] && [[" "B" == "B"]] &&エコー 'foo''は私のために働く –

+0

はい、動作します。あなたが提案する代替構文が間違っていると言っているわけではありません。私の主張は、論理演算子を条件文の外に置くことを推奨するのは良いアドバイスだとは思わないと言いました。それが(それかもしれない)なら、それは私にとって新しいものです。 – Fred

0

されます数値比較のためにexpr

if [[ -z "$avail" && "$WIFI_ID" = "some_str" ]] && ((DOUBLE_CHECK % 2 == 0)); then 
    # your logic here 
fi 

注意してください$のefixing変数は((...))の中ではオプションです。引用変数は[[ ... ]]の中ではオプションです。そこでは単語の分割やグロビングが行われないためです。別の答えで述べたように

関連する問題