我是shell脚本的新手,所以我有一个问题。我在这段代码中做错了什么?
#!/bin/bash
echo " Write in your age: "
read age
if [ "$age" -le "7"] -o [ "$age" -ge " 65" ]
then
echo " You can walk in for free "
elif [ "$age" -gt "7"] -a [ "$age" -lt "65"]
then
echo " You have to pay for ticket "
fi
当我试图打开这个脚本时,它询问我的年龄然后它说
./bilet.sh: line 6: [: 7]: integer expression expected
./bilet.sh: line 9: [: missing `]'
我不知道我做错了什么。如果有人能告诉我如何修复它,我会很感激,抱歉我的英语不好,我希望你们能理解我。
答案 0 :(得分:30)
您可以使用以下语法:
#!/bin/bash
echo " Write in your age: "
read age
if [[ "$age" -le 7 || "$age" -ge 65 ]] ; then
echo " You can walk in for free "
elif [[ "$age" -gt 7 && "$age" -lt 65 ]] ; then
echo " You have to pay for ticket "
fi
答案 1 :(得分:11)
如果您使用-o
(或-a
),则需要位于test
命令的括号内:
if [ "$age" -le "7" -o "$age" -ge " 65" ]
但是,不推荐使用它们,您应该使用test
(或||
)加入的单独&&
命令代替:
if [ "$age" -le "7" ] || [ "$age" -ge " 65" ]
确保结束括号前面有空格,因为它们在技术上是[
的参数,而不仅仅是语法。
在bash
和其他一些shell中,您可以使用kamituel's answer中所示的高级[[
表达式。以上内容适用于任何符合POSIX标准的shell。
答案 2 :(得分:6)
如果您要比较的变量具有不是数字/数字的隐藏字符,也会发生此错误。
例如,如果要从第三方脚本检索整数,则必须确保返回的字符串不包含hidden characters,例如"\n"
或"\r"
强>
例如:
#!/bin/bash
# Simulate an invalid number string returned
# from a script, which is "1234\n"
a='1234
'
if [ "$a" -gt 1233 ] ; then
echo "number is bigger"
else
echo "number is smaller"
fi
这会导致脚本错误: integer expression expected
,因为$a
包含非数字换行符"\n"
。您必须使用此处的说明删除此字符:How to remove carriage return from a string in Bash
所以使用这样的东西:
#!/bin/bash
# Simulate an invalid number string returned
# from a script, which is "1234\n"
a='1234
'
# Remove all new line, carriage return, tab characters
# from the string, to allow integer comparison
a="${a//[$'\t\r\n ']}"
if [ "$a" -gt 1233 ] ; then
echo "number is bigger"
else
echo "number is smaller"
fi
您还可以使用set -xv
调试bash脚本并显示这些隐藏的字符。见https://www.linuxquestions.org/questions/linux-newbie-8/bash-script-error-integer-expression-expected-934465/
答案 3 :(得分:4)
./bilet.sh: line 6: [: 7]: integer expression expected
小心" "
./bilet.sh: line 9: [: missing `]'
这是因为你需要在括号之间留出空格,如:
if [ "$age" -le 7 ] -o [ "$age" -ge 65 ]
看:增加了空间,没有" "
答案 4 :(得分:1)
试试这个:
If [ $a -lt 4 ] || [ $a -gt 64 ] ; then \n
Something something \n
elif [ $a -gt 4 ] || [ $a -lt 64 ] ; then \n
Something something \n
else \n
Yes it works for me :) \n
答案 5 :(得分:0)
如果您只是比较数字,我认为无需更改语法,只需更正第6行和第9行括号即可。
第6行之前:if [“ $ age” -le “ 7”] -o [“ $ age” -ge “ 65” ]
之后:if [ "$age" -le "7" -o "$age" -ge "65" ]
第9行之前:elif [“ $ age” -gt“ 7”] -a [“ $ age” -lt “ 65”]
之后:elif [ "$age" -gt "7" -a "$age" -lt "65" ]