私はこれを理解していません:
スクリプト:WORKDIR/sh/script.sh
[ -e filename ] \
&& echo filename \
|| [ -e ../filename ] \
&& echo ../filename \
|| { echo 'ERROR: failed to find "filename"' 1>&2 ; exit -1; }
出力:
$ cd WORKDIR/sh
$ ./script.sh
../filename
$ cd WORKDIR
$ sh/script.sh
filename
../filename # <---- WHY????
私の考え:
1
[ -e filename ] \ -> false
&& -> skip this, it is already false
echo filename \ -> don't even try
|| [ -e ../filename ] \ -> true
&& echo ../filename \ -> true
|| -> already true, skip the rest
{ echo 'ERROR: failed to find "filename"' 1>&2 ; exit -1; }
2
[ -e filename ] \ -> true
&& echo filename \ -> true
|| -> already true, skip the rest
[ -e ../filename ] \
&& echo ../filename \
|| { echo 'ERROR: failed to find "filename"' 1>&2 ; exit -1; }
バージョン:
bash --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
ベストアンサー1
&&
||
優先順位が同じなので、次のようになります。
コマンドが入ったら、&&
すぐに隣接する演算子でなくても、次のコマンドを見つけて実行します。あなたはする必要がありますいいえ単一のコマンド・リストでこれらの演算子を複数使用します。複数が必要な場合は、if / then構造を使用できます。
$ true && true || echo yes && echo no
no
これは次のように大きく異なります。
if true; then
true
else
echo yes && echo no
fi
$ if true; then true; else echo yes && echo no; fi
$
または:
$ true && false || echo yes && echo no
yes
no
$ if true; then false; else echo yes && echo no; fi
$
私はあなたの構成を次のように書きます:
if [ -e filename ]; then
echo filename
elif [ -e ../filename ]; then
echo ../filename
else
echo 'ERROR: failed to find "filename"' >&2
exit -1
fi