shell脚本中的整数表达式预期错误

use*_*832 26 bash shell

我是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
Run Code Online (Sandbox Code Playgroud)

当我试图打开这个脚本时,它询问我的年龄,然后它说

./bilet.sh: line 6: [: 7]: integer expression expected
./bilet.sh: line 9: [: missing `]'
Run Code Online (Sandbox Code Playgroud)

我不知道我做错了什么.如果有人能告诉我如何修复它,我会很感激,抱歉我的英语不好,我希望你们能理解我.

kam*_*uel 32

您可以使用以下语法:

#!/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
Run Code Online (Sandbox Code Playgroud)

  • 当我这样做时,我得到`test.sh:第3行:[[:109 test:表达式中的语法错误(错误标记是"test")) (4认同)

che*_*ner 11

如果您正在使用-o(或-a),则需要在test命令的括号内:

if [ "$age" -le "7" -o "$age" -ge " 65" ]
Run Code Online (Sandbox Code Playgroud)

但是,它们的使用已弃用,您应该使用test由||(或&&)连接的单独命令:

if [ "$age" -le "7" ] || [ "$age" -ge " 65" ]
Run Code Online (Sandbox Code Playgroud)

确保结束括号前面有空格,因为它们在技术上是参数[,而不仅仅是语法.

在bash和其他一些shell中,你可以使用kamituel的答案中[[所示的高级表达式.以上内容适用于任何符合POSIX标准的shell.


小智 6

./bilet.sh: line 6: [: 7]: integer expression expected
Run Code Online (Sandbox Code Playgroud)

小心 " "

./bilet.sh: line 9: [: missing `]'
Run Code Online (Sandbox Code Playgroud)

这是因为您需要在括号之间留有空格,例如:

if [ "$age" -le 7 ] -o [ "$age" -ge 65 ]
Run Code Online (Sandbox Code Playgroud)

看:增加了空间,没有 " "


Mr-*_*IDE 6

如果您正在比较的变量具有不是数字/数字的隐藏字符,也会发生此错误。

例如,如果要从第三方脚本中检索整数,则必须确保返回的字符串不包含诸如或的隐藏字符"\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
Run Code Online (Sandbox Code Playgroud)

这将导致脚本错误,: integer expression expected因为$a其中包含非数字的换行符"\n"。您必须按照以下说明删除此字符:如何从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
Run Code Online (Sandbox Code Playgroud)

您还可以set -xv用来调试bash脚本并显示这些隐藏的字符。参见https://www.linuxquestions.org/questions/linux-newbie-8/bash-script-error-integer-expression-expected-934465/