bash的逻辑运算符是如何工作的(或者为什么不在这里工作)?
我有以下包装器脚本:bash的逻辑运算符是如何工作的(或者为什么不在这里工作)?,bash,boolean,Bash,Boolean,我有以下包装器脚本: #!/bin/bash $local_time=`date +%H%M` if [ $local_time -ge 1430 ] && [ $local_time -le 2230 ] || [ $local_time -ge 0300 ] && [ $local_time -le 0400 ] then echo 'pass' else echo 'skip' fi 其思想是创建一个包装器脚本,在两个不相交的时间间隔之
#!/bin/bash
$local_time=`date +%H%M`
if [ $local_time -ge 1430 ] && [ $local_time -le 2230 ] ||
[ $local_time -ge 0300 ] && [ $local_time -le 0400 ]
then
echo 'pass'
else
echo 'skip'
fi
其思想是创建一个包装器脚本,在两个不相交的时间间隔之间运行脚本。被或的每个表达式都正确计算,但是,当I或两个表达式都被计算时,测试失败
如何解决此问题?您有两个问题
只有在展开变量时,才在变量赋值时使用$作为前缀
您需要使用parens强制运算符优先级
此外,由于您已经在使用bash,因此最好将其更好的语法与允许您使用比较运算符的构造结合使用您可以使用$替换命令,而不是backticks/gravemarks
#!/bin/bash
local_time=$(( 10#$( date +'%H%M' ) ))
if (( ( local_time >= 1430 && local_time <= 2230 ) ||
( local_time >= 10#0300 && local_time <= 10#0400 ) ))
then
echo 'pass'
else
echo 'skip'
fi
以零开头的数字被解释为八进制。
此外,任何以0开头并包含8或9的数字都将打印错误。
前缀10解决了这个问题 你有两个问题
只有在展开变量时,才在变量赋值时使用$作为前缀
您需要使用parens强制运算符优先级
此外,由于您已经在使用bash,因此最好将其更好的语法与允许您使用比较运算符的构造结合使用您可以使用$替换命令,而不是backticks/gravemarks
#!/bin/bash
local_time=$(( 10#$( date +'%H%M' ) ))
if (( ( local_time >= 1430 && local_time <= 2230 ) ||
( local_time >= 10#0300 && local_time <= 10#0400 ) ))
then
echo 'pass'
else
echo 'skip'
fi
以零开头的数字被解释为八进制。
此外,任何以0开头并包含8或9的数字都将打印错误。
前缀10解决了这个问题 bash没有逻辑运算符;这些都是条件链。逻辑属于测试
if [[ ( 10#${local_time} -ge 10#1430 && 10#${local_time} -le 10#2230 ) || \
( 10#${local_time} -ge 10#0300 && 10#${local_time} -le 10#0400 ) ]]
then
...
bash没有逻辑运算符;这些都是条件链。逻辑属于测试
if [[ ( 10#${local_time} -ge 10#1430 && 10#${local_time} -le 10#2230 ) || \
( 10#${local_time} -ge 10#0300 && 10#${local_time} -le 10#0400 ) ]]
then
...
您只需使用几个括号强制执行适当的优先级:
#!/bin/bash
local_time=$(date +%H%M)
if ( [ "$local_time" -ge 1430 ] && [ "$local_time" -le 2230 ] ) ||
( [ "$local_time" -ge 0300 ] && [ "$local_time" -le 0400 ] )
then
echo 'pass'
else
echo 'skip'
fi
原因:在AND-OR列表中,&&和| |具有相同的优先级。
注意:以0开头的[]内数字不解释为八进制
其他变化:
equal的左侧应该只有变量名No$。
建议使用$而不是“`”。
在[]内引用变量。
您只需使用几个括号强制执行适当的优先级:
#!/bin/bash
local_time=$(date +%H%M)
if ( [ "$local_time" -ge 1430 ] && [ "$local_time" -le 2230 ] ) ||
( [ "$local_time" -ge 0300 ] && [ "$local_time" -le 0400 ] )
then
echo 'pass'
else
echo 'skip'
fi
原因:在AND-OR列表中,&&和| |具有相同的优先级。
注意:以0开头的[]内数字不解释为八进制
其他变化:
equal的左侧应该只有变量名No$。
建议使用$而不是“`”。
在[]内引用变量。
对更现代的Bash的一个很好的介绍是:我更喜欢这种语法!。我用的是什么语法?。我的印象是bash语法?@skyeagle bash是一个兼容POSIX的shell,您使用的语法是bash的一个子集。对更现代的bash的一个很好的介绍是:我更喜欢这种语法!。我用的是什么语法?。我的印象是bash语法?@skyeagle bash是一个兼容POSIX的shell,您使用的语法是bash所能做的一个子集。