bash中的expr和if
这个代码怎么了?如果我输入数字25,它将输出失败,而不是lol。我错过什么了吗bash中的expr和if,bash,comparison,arithmetic-expressions,Bash,Comparison,Arithmetic Expressions,这个代码怎么了?如果我输入数字25,它将输出失败,而不是lol。我错过什么了吗 read -p "Enter number : " num if [ `expr $num > 5` ] then echo "lol" else echo "failed" fi 代码 if [ `expr $num > 5` ] 其实不要你想。它将运行expr$num>5,因此计算参数并将输出重定向到名为5(“将25放入名为5的文件中”)的文件,并且if将计算上一个表达式的返回码 如果
read -p "Enter number : " num
if [ `expr $num > 5` ]
then
echo "lol"
else
echo "failed"
fi
代码
if [ `expr $num > 5` ]
其实不要你想。它将运行expr$num>5
,因此计算参数并将输出重定向到名为5
(“将25放入名为5的文件中”)的文件,并且if
将计算上一个表达式的返回码
如果代码用于检查和评估数字是否大于5,则替换
if [ `expr $num > 5` ]
与
-gt
代表大于@babtistemm的答案为您提供了建议的解决方案,但如果您出于某种原因坚持使用(稍旧的)expr
:
read -p "Enter number : " num
if expr "$num" '>' 5 >/dev/null
then
echo "lol"
else
echo "failed"
fi
注:
您需要引用
,以便shell不会将其解释为重定向标准输出。您也可以使用\>
最好将双引号添加到$num
中,以便expr
将其解释为一个表达式,从而限制出现严重错误或恶意用户入侵程序的机会。(最好在使用前对$num
进行一次完整性检查,例如检查它是否为整数。)
此解决方案需要调用一个新进程,expr
,这比仅使用test
shell命令从操作系统花费更多的资源
如果省略/dev/null
,您还将得到一个0
或1
(意思是false
或true
),expr
的stdout
。但是独立于此,expr
根据表达式的结果设置其退出状态,$?
,然后由if
测试。(旁注:如果您在调用expr
后尝试echo$?
,首先可能会意外地发现$?=0
表示退出状态为true/success,而$?!=0
按惯例表示false。)
可以在bash中使用算术表达式:
if (( num > 5 )); then ...
在手册中,请参见短行中的相同内容:
可以浓缩为:
read -p 'Enter a number: ' num;((num>5))&&echo lol||echo fail
如果first命令成功,此语法将起作用
read -p 'Enter a number: ' num
((num > 5)) && {
echo lol
/bin/wrongcommand
:
} || echo fail
可以输出:
lol
bash: /bin/wrongcommand: No such file or directory
但是没有任何失败
,因为:
(是true
的别名)将永远成功
当然,您可以将失败的命令分组:
可以这样写:
read -p 'Enter a number: ' num;((num>5))&&{ echo lol;/bin/wrongcommand;:;}||{ echo fail;other command;}
您可以在{
和;}
之间对命令进行分组(注意第一个{
后面的空格!)
if
不计算上一个表达式的返回代码。这里失败的原因是expr
输出被重定向到文件名5
,因此expr
不会向stdout输出任何内容。如果调用是expr$num+5
则代码将回显“lol”
您缺少一个空格:[“$num”-gt 5]
。只有$num
是参数;expr 25
的输出将写入名为5
的文件。检查输入是否正确也是一个好主意,这样用户提供的数据就不会生成语法无效的代码(可能容易被利用)。例如:如果expr“${num}”:“[0-9][0-9]*$”&&expr“$num”>'5>/dev/null;那么
当然,上面的代码是100%易受攻击的。我担心恶意用户可能会在脚本权限下执行任何代码,即使您将第一个操作数引用为“$num”
@ghoti您对引号的看法是正确的,但我认为正则表达式对于OP的问题来说是过分的。@tif除非expr
公开了一种执行代码的方法,如果参数被引用,您就不会受到攻击。请参阅:。另请参阅:在Unix和Linux SE上以及。
lol
bash: /bin/wrongcommand: No such file or directory
read -p 'Enter a number: ' num
((num > 5)) && {
echo lol
/bin/wrongcommand
:
} || {
echo fail
other command
}
read -p 'Enter a number: ' num;((num>5))&&{ echo lol;/bin/wrongcommand;:;}||{ echo fail;other command;}
Enter a number: 4
fail
bash: other: command not found
Enter a number: 7
lol
bash: /bin/wrongcommand: No such file or directory