• ベストアンサー

【bash】elifではない条件分岐

bashスクリプトにて3つの条件を、If~elif~elseを使って分岐させていたのですが、 それぞれの条件を全て確認させたいという要件に変更となり、下記のように修正しました。 if (条件1); then <処理1> fi if (条件2); then <処理2> fi if (条件3); then <処理3> fi else <処理4> fi <処理5> 条件1~3はそれぞれ当てはまった場合に処理1~3を行い、 条件1~3にいずれも当てはまらなかった場合処理4を行う。 ↑上記全て終了したら処理5を行う という動きが希望なのですが、これですと条件1~3にいずれも 当てはまらなかった場合に処理4が行われません。 と、言うより先に最後のfiでsyntax errが出たので、処理4の後の fiを外したのですが、処理4と処理5が並列に扱われて? 両者とも行われなくなってしまいました。 書いていて、何となく条件1~3の前にさらにifを被せるのかなとも 思うのですが、イマイチぼんやりしています。 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.5

cond=true if (条件1); then cond=false <処理1> fi if (条件2); then cond=false <処理2> fi if (条件3); then cond=false <処理3> fi if $cond then <処理4> fi <処理5>

charieroot
質問者

お礼

cond は初めて知りましたが、希望通りの動きで感動しました! 勉強になりましたので、ベストアンサーとさせて頂きます。 ありがとうございました。

その他の回答 (4)

  • entree
  • ベストアンサー率55% (405/735)
回答No.4

↓こう書くべきです。 if (条件1) && (条件2) && (条件3); then  if (条件1); then   <処理1>  fi  if (条件2); then   <処理2>  fi  if (条件3); then   <処理3>  fi else  <処理4> fi <処理5>

charieroot
質問者

お礼

先の質問に、 >条件1~3の前にさらにifを被せるのかなとも >思うのですが、イマイチぼんやりしています。 と書きましたが、おぼろげに浮かんでた構文がそちらでした! ありがとうございました。

回答No.3

変数でフラグを作るかな。 f=0 if [条件1]; then <処理1> f=1 fi if [条件2]; then <処理2> f=1 fi if [条件3]; then <処理3> f=1 fi if [$f -eq 0]; then <処理4> fi <処理5> もしくは、冗長な感じがあるけど、 if [条件1 -o 条件2 -o 条件3]; then if [条件1]; then <処理1> fi if [条件2]; then <処理2> fi if [条件3]; then <処理3> fi else <処理4> fi <処理5>

charieroot
質問者

お礼

何度もご回答ありがとうございました。フラグは思いつきませんでした。

回答No.2

if [条件1 -a 条件2 -a 条件3]; then <処理1> <処理2> <処理3> else <処理4> fi <処理5> 最初の回答はfiの場所が間違ってました。 あなたはまずシェルスクリプトのリファレンスを見た方がいいかもね。

charieroot
質問者

お礼

ありがとうございます。 頂いた回答も、先ほどと同様の動きとなってしまうような気がします。 (処理4は条件1~3全てが当てはまらない(偽)のときのみ行いたい、の 部分は良いように思います) 週末はお返事が書けないかも知れませんが、引き続き回答を募集して おりますので宜しくお願いいたします。

回答No.1

if [条件1 -a 条件2 -a 条件3]; then <処理1> <処理2> <処理3> fi else <処理4> fi <処理5>

charieroot
質問者

お礼

ありがとうございます。 教えて頂いた記述ですと、条件1かつ条件2かつ条件3の時、処理1~3を全て行う となりませんでしょうか? 質問の仕方が悪く申し訳ありません。 条件1に当てはまれば処理1を行い、条件2に当てはまれば処理2を行い、 条件3に当てはまれば処理3を行う・・これらはそれぞれ独立しています。 つまり、条件1に当てはまるかは関係なく、条件2に当てはまれば 処理2を行います。条件3も同様です。 elifは、条件1が当てはまらなければ、条件2~3はスルーするかと 思いますが、そこが異なります。 但し、処理4は条件1~3全てが当てはまらない(偽)のときのみ行いたいのです。

関連するQ&A