2017-06-29 40 views
0

需要小解释:为什么这样做不起作用?检查传递的参数是否等于bash脚本中的字符串

#!/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
非常感谢那些可以发现错误的人。

回答

1

因为逻辑或||,您应该使用和&&否则条件总是正确的想法否定字符串不能等于三个值。

1

你有一种非理性的状态...

if [ "$ker" != "iso" ] || [ "$ker" != "om" ] || [ "$ker" != "constbeta" ] ; then 

如果$ker是“ISO”,那么它是不是“嗡”的条件匹配。如果$ker是“om”,那么它不是“iso”并且条件匹配。你想要的是或者一个正面检查的清单,并有一个“其他”的条件,而不是负面的检查。

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标准的可能优点。

+0

我明白了。谢谢你们俩。 ps:你的第二个建议不起作用,但是我会想到我们的 – andrea

+0

@andrea - Varsågod,这就是我们在这里所做的。 :)第二个建议做什么而不是工作?你有错误吗? – ghoti

+0

不,它的工作原理。它只是不按我想的方式工作(即相反)。我仍然需要学习bash格式化语法,我只是从来没有时间。 taksåmycket! – andrea

相关问题