我不明白:
脚本: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)
&&
并且||
具有相同的优先级,所以:当一个命令通过时,它会寻找下一个
&&
并执行它,即使它不是直接相邻的操作符。您永远不应在单个命令列表中使用多个这些运算符。如果需要多个,则使用 if/then 构造。这与以下有很大不同:
或者:
我会把你的构造写成:
我认为您希望 bash 这样做:
但它实际上是这样做的
如果 B 或 C 成功,则 D执行。
添加更多分组:
或者
if-elif-else
或者使用@Jesse_b 展示的非常清晰易读的风格。一步一步,这正在发生:
文件名在当前目录中:
文件名在父目录中: