3 回答
TA贡献1776条经验 获得超12个赞
经典技术(转义元字符):
if [ \( "$g" -eq 1 -a "$c" = "123" \) -o \( "$g" -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi
我已经$g用双引号将引用括起来;一般来说,这是一个好习惯。严格来说,并不需要括号,因为的优先级-a,并-o使得它纠正,甚至没有他们。
请注意,-aand -o运算符是testaka 的POSIX规范的一部分[,主要是为了向后兼容(例如,因为它们是test7th Edition UNIX 的一部分),但是POSIX将它们明确标记为“过时”。Bash(请参阅条件表达式)似乎抢先了经典和POSIX的含义,-a并-o带有自己的接受参数的替代运算符。
一定要小心,您可以使用更现代的[[运算符,但是请注意,例如Bash和Korn Shell中的版本不必相同。
for g in 1 2 3
do
for c in 123 456 789
do
if [[ ( "$g" -eq 1 && "$c" = "123" ) || ( "$g" -eq 2 && "$c" = "456" ) ]]
then echo "g = $g; c = $c; true"
else echo "g = $g; c = $c; false"
fi
done
done
在Mac OS X上使用Bash 3.2.57运行示例:
g = 1; c = 123; true
g = 1; c = 456; false
g = 1; c = 789; false
g = 2; c = 123; false
g = 2; c = 456; true
g = 2; c = 789; false
g = 3; c = 123; false
g = 3; c = 456; false
g = 3; c = 789; false
您不需要像使用引号一样引用变量[[,[因为它不是以相同的方式[是单独的命令。
这不是一个经典的问题吗?
我会这么想的。但是,还有另一种选择,即:
if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi
的确,如果您阅读了该autoconf工具或相关软件包的“便携式外壳”指南,则建议使用“ ||”和“ &&” 这种符号。我想您甚至可以做到:
if [ "$g" -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ "$g" -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi
在动作像回声一样琐碎的情况下,这还不错。当要重复的动作块为多行时,重复会很痛苦,并且较早的版本之一是可取的-否则您需要将动作包装到在不同then块中调用的函数中。
TA贡献1799条经验 获得超8个赞
使用/bin/bash以下方法将起作用:
if [ "$option" = "Y" ] || [ "$option" = "y" ]; then
echo "Entered $option"
fi
- 3 回答
- 0 关注
- 6355 浏览
添加回答
举报