我不明白为什么这个if
声明会出错:
使用太多参数
if [ $file == 'Metro[0-9]*' ] -o [ $file == 'Store[0-9]*' ]
echo "$file"
我确实使用了括号中的每一个组合,认为可能存在错误但没有任何改变。有趣的是,如果我只使用其中一个条件并擦除另一个条件,则条件有效。所以我假设使用-o
或括号......
答案 0 :(得分:4)
没有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
请注意引用中的多项更改:如果要扩展,通配符不能在引号内,并且文件名通常应在双引号内(尽管[[
之后不需要它或case
)。
另请注意,对[[
的更改不是POSIX sh
命令 - 上面的第一个选择特定于Bash / Ksh / other"现代"延长的炮弹。 POSIX [
(又名test
)没有简单的方法来检查文件是否与任意通配符表达式匹配。不过,Bash也支持if [ condition1 -o condition2 ]
,但这也不是便携式的,所以在某种程度上是两个世界中最糟糕的。
答案 1 :(得分:1)
then
条件缺失fi
和-o
。||
运算符不存在,但您可以使用=~
表示OR。if [[ "$file" =~ (Metro|Store)[0-9]* ]] ; then
echo "$file"
fi
运算符将字符串与正则表达式进行比较。所以你可以写下这样的条件:
contains