在 Bash shell if 语句中使用逻辑或
Using logical OR in a Bash shell if statement
我不明白为什么这个 if
语句会给出错误消息:
Using too many arguments
if [ $file == 'Metro[0-9]*' ] -o [ $file == 'Store[0-9]*' ]
echo "$file"
我从字面上使用了括号的每一种组合,认为可能有错误但没有改变。有趣的是,如果我只使用其中一个条件并删除另一个条件,条件就会起作用。所以我假设使用 -o
或括号有问题...
没有shell运算符-o
,你好像在找
if [[ $file == 'Metro'[0-9]* || $file == 'Store'[0-9]* ]]; then
echo "$file"
fi
这当然是更简洁和便携的写法
case $file in 'Metro'[0-9]* | 'Store'[0-9]*) echo "$file";; esac
请注意引号中的多项更改:如果要扩展通配符,则不得将它们放在引号内,并且文件名通常应放在双引号内(尽管在 [[
或 [=14 之后没有必要) =]).
另请注意对 [[
的更改,它不是 POSIX sh
命令——上面的第一个选项特定于 Bash / Ksh / other "modern" 扩展 shells。 POSIX [
(又名 test
)没有简单的方法来检查文件是否与任意通配符表达式匹配。顺便说一下,Bash 也支持 if [ condition1 -o condition2 ]
但那也不是可移植的,所以在某种程度上是两个世界中最糟糕的。
- 您的
if
条件缺失 then
和 fi
。
- 不存在
-o
运算符,但可以用||
表示OR。
- 由于您使用的是 Bash,因此您可以使用
=~
运算符将字符串与正则表达式进行比较。
所以你可以这样写你的条件:
if [[ "$file" =~ (Metro|Store)[0-9]* ]] ; then
echo "$file"
fi
我不明白为什么这个 if
语句会给出错误消息:
Using too many arguments
if [ $file == 'Metro[0-9]*' ] -o [ $file == 'Store[0-9]*' ]
echo "$file"
我从字面上使用了括号的每一种组合,认为可能有错误但没有改变。有趣的是,如果我只使用其中一个条件并删除另一个条件,条件就会起作用。所以我假设使用 -o
或括号有问题...
没有shell运算符-o
,你好像在找
if [[ $file == 'Metro'[0-9]* || $file == 'Store'[0-9]* ]]; then
echo "$file"
fi
这当然是更简洁和便携的写法
case $file in 'Metro'[0-9]* | 'Store'[0-9]*) echo "$file";; esac
请注意引号中的多项更改:如果要扩展通配符,则不得将它们放在引号内,并且文件名通常应放在双引号内(尽管在 [[
或 [=14 之后没有必要) =]).
另请注意对 [[
的更改,它不是 POSIX sh
命令——上面的第一个选项特定于 Bash / Ksh / other "modern" 扩展 shells。 POSIX [
(又名 test
)没有简单的方法来检查文件是否与任意通配符表达式匹配。顺便说一下,Bash 也支持 if [ condition1 -o condition2 ]
但那也不是可移植的,所以在某种程度上是两个世界中最糟糕的。
- 您的
if
条件缺失then
和fi
。 - 不存在
-o
运算符,但可以用||
表示OR。 - 由于您使用的是 Bash,因此您可以使用
=~
运算符将字符串与正则表达式进行比较。
所以你可以这样写你的条件:
if [[ "$file" =~ (Metro|Store)[0-9]* ]] ; then
echo "$file"
fi