我需要在Bash脚本中配置逻辑运算符(&&,||)。换句话说,我想从配置文件中读取一个代表运算符的文字,并在脚本中使用它。
示例表达式为:
if [ -n $var1 ] $LOP [ -n $var2]
其中
$LOP = '&&' or '||' as read from the config file.
这甚至可能吗?使用我所显示的表达式会导致错误。
答案 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
功能强大但非常危险。如果您能够绝对信任被篡改的变量的内容,请仅使用 。