dポイントプレゼントキャンペーン実施中!

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 の終了ステータスです。

A 回答 (5件)

Solaris10 の test(1) には優先順位も書いてあったりします>#2.


これくらい基本的なコマンドだと, どのシステムの man を参照してもほとんど同じ.

参考URL:http://docs.sun.com/app/docs/doc/819-1210/test-1 …

この回答への補足

test expr
[ expr ]
条件式 expr を評価した結果に基づいて、ステータス 0 または 1 を返します。演算子とオペランドそれぞれは別々の引き数でなければなりません。式は前述の 条件式セクションで説明したプライマリで構成されます。式は次に示す演算子を使って結合できます。優先度の高い順に示します。

! expr expr が偽ならば真になります。
( expr )
expr の値を返します。これを使うと、通常の演算子の優先度を 変
更できます。

man のtestコマンドにはこう書いてありますが、今試してみましたがエラーがでます。最初の質問と一緒です。

試しに \( \) で囲ってみましたが、 -eq がきかなくなってしまいました。

参考urlではエスケープの必要性が説かれていますね。
エスケープをするときに、なにかコツがいるのでしょうか?

補足日時:2009/11/26 10:12
    • good
    • 0
この回答へのお礼

よくみてみたら、 \( と $BARをくっつけて書いてました。
このふたつを離したら、うまく動作しました。
ありがとうございました。

お礼日時:2009/11/26 10:25

そう, 「\($BAR」と書くと, これ全体を 1つのものと解釈してしまいます. #1 の「それぞれを単独の引数として渡さなければならない」はこの辺のことを書いたつもりだったりします.


もちろん「左かっこが 2つ続く」ときも「\( \(」のように書かなければなりません, 念のためですが.
    • good
    • 0

#2です。

すいません。man bash の testコマンドの所に優先度のことも含めて書いてありますね。昔は書いてなかったと思うけど。
    • good
    • 0

結論から言うと、-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} \) で動作を確認しました。

ありがとうございました。

補足日時:2009/11/26 10:25
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
この優先順位のおかげで、スクリプトは思った通り動いていますが、これは演習でやってることなので、やはり優先順位をつけたいです。()を使用して、うまくエスケープできないかが課題です。

お礼日時:2009/11/26 10:20

もちろん () で優先順位を変えることができます. ただし ( や ) はシェルにとっても意味を持つので適切にエスケープしなければならないこと, それぞれを単独の引数として渡さなければならないことには注意しなければなりません.


ちなみにその書き方なら調べるべきは test.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
testコマンドを読み込んでみます

お礼日時:2009/11/26 10:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!