有没有办法将逻辑运算符存储在Bash脚本变量

时间:2015-12-28 06:32:24

标签: bash scripting

我需要在Bash脚本中配置逻辑运算符(&&,||)。换句话说,我想从配置文件中读取一个代表运算符的文字,并在脚本中使用它。

示例表达式为:

if [ -n $var1 ] $LOP [ -n $var2]

其中

$LOP = '&&' or '||' as read from the config file.

这甚至可能吗?使用我所显示的表达式会导致错误。

3 个答案:

答案 0 :(得分:2)

您可以在SELECT EXTRACT(YEAR FROM subdateshow) FROM tbl_name; 命令中执行此操作:

[

您需要使用if [ -n "$var1" "$LOP" -n "$var2" ] 代表“和”(-a)和&&代表“或”({ {1}})。

使用-o时,引用变量扩展是非常重要的。如果您不引用扩展且变量为空或未定义,则测试表达式将具有不正确的语法。例如,如果||未定义,则[将被评估为$var1,这始终为真。

答案 1 :(得分:1)

您可以简单地使用案例陈述:

case $LOP in
  ('&&' | 'and')
    if [ -n "$var1" -a -n "$var2" ]; then ...; fi
    ;;
  ('||' | 'or')
    if [ -n "$var1" -o -n "$var2" ]; then ...; fi
    ;;
  (*)
    printf '%s: invalid operator: "%s"\n' "${0##*/}" "$LOP" >&2
    ;;
esac

请注意,在$LOP中扩展并接受更易读的值是多么容易。它也是便携式的,因为它不依赖于基础。

答案 2 :(得分:0)

如果您的用例允许,您可以将整个条件读入某个变量并使用eval进行评估,例如:

var1=2
var2=42

while read -r cond
do
    eval "[[ $cond ]]" && { echo "$cond true"; } || { echo "$cond false"; }

done < <(sed '/^[ \t]*#/d;/^[ \t]*$/d' <<'EOF'
#complex tests
-n $var1 && -z $var2
$var1 == 1 || $var2 == 42

#arithmetics
$(($var2 + $var1)) < 44
$(($var2 + $var1)) < 45

#even commands
$(date +%Y) < 2014
EOF
)

产生

-n $var1 && -z $var2 false
$var1 == 1 || $var2 == 42 true
$(($var2 + $var1)) < 44 false
$(($var2 + $var1)) < 45 true
$(date +%Y) < 2014 false

eval功能强大但非常危险。如果您能够绝对信任被篡改的变量的内容,请仅使用