- ベストアンサー
シェルで and/or の優先順位について
echo "" echo " $BAR1 | $BAR2 | $BAR3 " echo "  ̄ ̄ ̄ ̄ ̄ ̄ ̄" echo " $BAR4 | $BAR5 | $BAR6 " echo "  ̄ ̄ ̄ ̄ ̄ ̄ ̄" echo " $BAR7 | $BAR8 | $BAR9 " echo "" if [ $BAR1 -eq $BAR2 -a $BAR1 -eq $BAR3 -o \ $BAR4 -eq $BAR5 -a $BAR4 -eq $BAR6 -o \ $BAR7 -eq $BAR8 -a $BAR7 -eq $BAR9 -o \ $BAR1 -eq $BAR5 -a $BAR1 -eq $BAR9 -o \ $BAR7 -eq $BAR5 -a $BAR7 -eq $BAR3 ]; then SCORE=`expr $SCORE + 700` else SCORE=`expr $SCORE - 30` fi echo "" echo " スコアは【 $SCORE 】 です。 " echo "" 簡単なスロットゲームを作ってみました。C言語では可能な AND/ORの優先順位づけ()がbashでも機能するでしょうか?自分なりにGoogleを探ってみましたが、満足のいく回答は見つけられませんでした。 以下の例では、エラーを返しました。 if [ (($BAR1 -eq $BAR2) -a ($BAR1 -eq $BAR3)) -o \ (($BAR4 -eq $BAR5) -a ($BAR4 -eq $BAR6)) -o \ … なお、manコマンドで以下の説明を見つけましたが、知識が足りずよく意味がわかりません。 なお、コピペの都合上、スペースやタブなどが反映されず、スクリプトが見づらくなっていますが、ご容赦願います。 ************************************************************* (list) list はサブシェル内で実行されます。シェルの環境に影響を与えるような変数の代入や組み込みコマンドは、コマンドの終了後に影響を残しません。返却ステータスは list の終了ステータスです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Solaris10 の test(1) には優先順位も書いてあったりします>#2. これくらい基本的なコマンドだと, どのシステムの man を参照してもほとんど同じ.
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
そう, 「\($BAR」と書くと, これ全体を 1つのものと解釈してしまいます. #1 の「それぞれを単独の引数として渡さなければならない」はこの辺のことを書いたつもりだったりします. もちろん「左かっこが 2つ続く」ときも「\( \(」のように書かなければなりません, 念のためですが.
- notnot
- ベストアンサー率47% (4901/10362)
#2です。すいません。man bash の testコマンドの所に優先度のことも含めて書いてありますね。昔は書いてなかったと思うけど。
- notnot
- ベストアンサー率47% (4901/10362)
結論から言うと、-a の方が優先度が高いです。見るmanは#1の方が書いた通り、man testですが、優先度については明示的に書かれてません。 true OR true AND false をやってみましょう。ANDが先なら全体がtrueになり、前から順番なら全体がfalseになるはず。 if [ X -o X -a "" ] ;then echo true; else echo false; fi の結果を見ると、-a が先に演算されていることがわかります。 なお、shやbashの && と || は同一優先度なので、前から順番です。 if true || true && false ;then echo true; else echo false; fi
お礼
ご回答ありがとうございます。 この優先順位のおかげで、スクリプトは思った通り動いていますが、これは演習でやってることなので、やはり優先順位をつけたいです。()を使用して、うまくエスケープできないかが課題です。
補足
\( ${BAR} \) で動作を確認しました。 ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
もちろん () で優先順位を変えることができます. ただし ( や ) はシェルにとっても意味を持つので適切にエスケープしなければならないこと, それぞれを単独の引数として渡さなければならないことには注意しなければなりません. ちなみにその書き方なら調べるべきは test.
お礼
ご回答ありがとうございます。 testコマンドを読み込んでみます
お礼
よくみてみたら、 \( と $BARをくっつけて書いてました。 このふたつを離したら、うまく動作しました。 ありがとうございました。
補足
test expr [ expr ] 条件式 expr を評価した結果に基づいて、ステータス 0 または 1 を返します。演算子とオペランドそれぞれは別々の引き数でなければなりません。式は前述の 条件式セクションで説明したプライマリで構成されます。式は次に示す演算子を使って結合できます。優先度の高い順に示します。 ! expr expr が偽ならば真になります。 ( expr ) expr の値を返します。これを使うと、通常の演算子の優先度を 変 更できます。 man のtestコマンドにはこう書いてありますが、今試してみましたがエラーがでます。最初の質問と一緒です。 試しに \( \) で囲ってみましたが、 -eq がきかなくなってしまいました。 参考urlではエスケープの必要性が説かれていますね。 エスケープをするときに、なにかコツがいるのでしょうか?