检查参数传递是否等于bash脚本中的字符串

时间:2017-06-29 13:37:42

标签: 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
非常感谢能够发现错误的人。

2 个答案:

答案 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兼容。