如何在 bash 的 if 语句中嵌套条件脚本运算符 -a -o

如何在 bash 的 if 语句中嵌套条件脚本运算符 -a -o

如果我想在 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-otest 运算符,并用于{ … }分组(请参阅终端中的括号和大括号之间的区别?)。这适用于任何 sh 风格的 shell。

if { [ -e file.txt ] && [ -r file.txt ]; } ||
   { [ -e file2.txt ] && [ -r file2.txt ]; }
then …

或者,您可以在单括号内使用\(and \)(或引用括号的任何其他方式)(再次参见为什么不带引号的空格参数扩展在双括号“[[”内有效,但在单括号“[”内无效?以获得解释)。但是,如果文件名看起来像测试运算符( (、、、...),这可能会导致条件解析不正确。=-e

相关内容