シェルの&&||パズル(解答編)
Fri Aug 30 09:31:16 JST 2013 (modified: Sun Oct 6 16:06:15 JST 2019)
views: 1575, keywords: この記事は最終更新日が5年以上前のものです。
この前、ここで、次の四つのコマンド列の出力を当てるクイズを無責任に出題しましたが、ちゃんと真面目に解答します。
false && true || true && echo OK <- 1
$ true && true || false || echo OK <- 2
$ true || true || true && echo OK <- 3
$ false && true || false || echo OK <- 4 $
考え方
シェルも一応言語ですが、基本、コマンドを起動するための道具なので、上から下、左から右に順にコマンドを起動していきます。それで、「&&」も「||」も、左のコマンドの終了ステータスによって、右のコマンドを起動するかどうか決めるものですので、右側のコマンドが起動されるかどうかをまず考えます。例えば1の問題だと、最初の二つのコマンドは、falseが起動されてtrueが起動されません。
false (<-起動される) && true (<- 起動されない) || true && echo OK $
次に考えなければいけないのは、&&や||が見ている終了ステータスは、最後に起動したコマンドの終了ステータスだということです。ですから、1の問題では、次のように解釈できます。ですので、|| true のtrueは実行され、その次のecho も実行されます。
false (<-起動される) && true (<- 起動されない) || (<- falseの終了ステータス) true && echo OK $
これをおさえて左から右に慎重に考えて行けば、答えは特定できるかと思います。
false && true || true && echo OK
$ OK
true && true || false || echo OK
$ true || true || true && echo OK
$ OK
false && true || false || echo OK
$ OK
しかし、可読性に重大な問題が発生するので、ぜひ使わないようにしていただきたく。
おしまい。