"foo&&bar || baz" は bash の "if foo; then bar; else baz" とは異なる動作をします。

私の考えでは

[ 1 -eq $1 ] && echo "yes" || echo "no"

のように振る舞う

if [ 1 -eq $1 ]; then
    echo "yes"
else
    echo "no"
fi

しかし、このスクリプトを実行すると(nocmd存在しないコマンドです)

#!/bin/bash

[ 1 -eq $1 ] && nocmd "yes" || echo "no"

パラメータ「1」の奇妙な出力が表示されます。

me@ubuntu:/tmp$ ./ddd.sh 0
no
me@ubuntu:/tmp$ ./ddd.sh 1
./sh.sh: line 3: nocmd: command not found
no

これがやっているようです:

if [ 1 -eq $1 ]; then
    nocmd "yes"
    if [ $? -ne 0 ]; then
        echo "no"
    fi
else
    echo "no"
fi

大丈夫ですか?私は何を逃したことがありませんか?

ベストアンサー1

全体的なシャットダウン状態に加えて、次のように動作します。

if
  ! { 
    [ 1 -eq $1 ] && nocmd "yes"
  }
then
  echo no
fi

存在する:

A || B

B失敗した場合にのみ実行されますA。 OR演算子です。

あなたの場合、Aiffは正常に実行されます[ 1 -eq $1 ] && nocmd "yes"(AND演算子)。この場合の終了状態は の終了状態になります。つまり、失敗すると実行されます(成功した場合にのみ実行されることを忘れないでください)。nocmd[Anocmdecho no[nocmd "yes"nocmd[

これはx && y || z汚いハッキングです。このため、使用を避けるのが最善です。 if/then/else ロジックが本当に必要な場合は、if// 構成を使用してください。そして両方が成功しない限り、必要な場合にのみ使用してください。thenelsex && y || zzxy

でも:

cmd && echo OK || echo >&2 KO

特定の病理学的条件echo OK(たとえば、ファイルシステム全体のファイルに移動するstdout)では失敗する可能性があり、echo >&2 KO最終的に実行される可能性があります。

$ bash -c 'true && echo OK || echo KO >&2' > /dev/full
bash: line 0: echo: write error: No space left on device
KO

おすすめ記事