如果我想在 if 语句中组合 -a 和 -o 脚本运算符,我该怎么做?例如:
if [ ( -e file.txt -a -r file.txt ) -o ( -e file2.txt -a -r file2.txt ) ]; then .... fi
我能完成这样的事情吗?现在,当我尝试运行此程序时,出现错误。
答案1
使用双括号(参见为什么不带引号的空格参数扩展在双括号“[[”内有效,但在单括号“[”内无效?)。使用&&
和||
双括号条件运算符而不是-a
和-o
测试/单括号条件运算符。这在 bash 中有效,在 ksh 和 zsh 中也有效,但在普通 sh 中无效。
if [[ ( -e file.txt && -r file.txt ) || ( -e file2.txt && -r file2.txt ) ]]; then
或者,对于单括号,[
在单个检查周围使用,在括号外部使用&&
和||
shell 运算符,而不是在括号内使用-a
和-o
test 运算符,并用于{ … }
分组(请参阅终端中的括号和大括号之间的区别?)。这适用于任何 sh 风格的 shell。
if { [ -e file.txt ] && [ -r file.txt ]; } ||
{ [ -e file2.txt ] && [ -r file2.txt ]; }
then …
或者,您可以在单括号内使用\(
and \)
(或引用括号的任何其他方式)(再次参见为什么不带引号的空格参数扩展在双括号“[[”内有效,但在单括号“[”内无效?以获得解释)。但是,如果文件名看起来像测试运算符( (
、、、...),这可能会导致条件解析不正确。=
-e