私の考えでは
[ 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演算子です。
あなたの場合、A
iffは正常に実行されます[ 1 -eq $1 ] && nocmd "yes"
(AND演算子)。この場合の終了状態は の終了状態になります。つまり、失敗すると実行されます(成功した場合にのみ実行されることを忘れないでください)。nocmd
[
A
nocmd
echo no
[
nocmd "yes"
nocmd
[
これはx && y || z
汚いハッキングです。このため、使用を避けるのが最善です。 if/then/else ロジックが本当に必要な場合は、if
// 構成を使用してください。そして両方が成功しない限り、必要な場合にのみ使用してください。then
else
x && y || z
z
x
y
でも:
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