必要的解释很简单:为什么这不起作用?
#!/bin/bash
ker=$1
if [ "$ker" != "iso" ] || [ "$ker" != "om" ] || [ "$ker" != "constbeta" ] ; then
printf " allowed kernels: iso, om, constbeta \n"
exit
fi
wait
echo 'anisotropy kernel: ', "$ker"
我也试过
#!/bin/bash
ker="$1"
if [ $ker != "iso" ] || [ $ker != "om" ] || [ $ker != "constbeta" ] ; then
printf " allowed kernels: iso, om, constbeta \n"
exit
fi
wait
echo 'anisotropy kernel: ', "$ker"
我称之为:$ ./script.sh iso
我甚至尝试过这样的事情(虽然我认为这对于这个问题没有意义
上面的脚本):$ ./script.sh "iso"
我总是得到allowed kernels: iso, om, constbeta
非常感谢能够发现错误的人。
答案 0 :(得分:1)
因为逻辑或||
,你应该使用和&&
否则条件总是正确的思考否定字符串不能等于三个值。
答案 1 :(得分:1)
你有一种不合理的情况......
if [ "$ker" != "iso" ] || [ "$ker" != "om" ] || [ "$ker" != "constbeta" ] ; then
如果$ker
是" iso",那么它不是" om"和条件匹配。如果$ker
是" om"然后它不是" iso"和条件匹配。你想要的是OR一个肯定的检查列表,并有一个"否则"条件,而不是或否定检查。
if [ "$ker" = "iso" ] || [ "$ker" = "om" ] || [ "$ker" = "constbeta" ] ; then
: do something useful
else
: report error
fi
或者,既然你是bash,你可以使用更简单的"条件:
if [[ "$ker" =~ ^(iso|om|constbeta)$ ]]; then
虽然如果你愿意,你可以使用其他结构:
case "$ker" in
iso|om|constbeta)
: this catches our "good" values
;;
*)
echo "Error" >&2
exit 1
;;
esac
这有可能与POSIX兼容。