Integer expression expected error in shell script

匿名 (未验证) 提交于 2019-12-03 08:35:02

问题:

I'm a newbie to shell scripts so I have a question. What Im doing wrong in this code?

#!/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 

When I'm trying to open this script it asks me for my age and then it says

./bilet.sh: line 6: [: 7]: integer expression expected ./bilet.sh: line 9: [: missing `]' 

I don't have any idea what I'm doing wrong. If someone could tell me how to fix it I would be thankful, sorry for my poor English I hope you guys can understand me.

回答1:

You can use this syntax:

#!/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 


回答2:

If you are using -o (or -a), it needs to be inside the brackets of the test command:

if [ "$age" -le "7" -o "$age" -ge " 65" ] 

However, their use is deprecated, and you should use separate test commands joined by || (or &&) instead:

if [ "$age" -le "7" ] || [ "$age" -ge " 65" ] 

Make sure the closing brackets are preceded with whitespace, as they are technically arguments to [, not simply syntax.

In bash and some other shells, you can use the superior [[ expression as shown in kamituel's answer. The above will work in any POSIX-compliant shell.



回答3:

./bilet.sh: line 6: [: 7]: integer expression expected 

Be careful with " "

./bilet.sh: line 9: [: missing `]' 

This is because you need to have space between brackets like:

if [ "$age" -le 7 ] -o [ "$age" -ge 65 ] 

look: added space, and no " "



回答4:

This error can also happen if the variable you are comparing has hidden characters that are not numbers/digits.

For example, if you are retrieving an integer from a third-party script, you must ensure that the returned string does not contain hidden characters, like "\n" or "\r".

For example:

#!/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 

This will result in a script error : integer expression expected because $a contains a non-digit newline character "\n". You have to remove this character using the instructions here: How to remove carriage return from a string in Bash

So use something like this:

#!/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 

You can also use set -xv to debug your bash script and reveal these hidden characters. See https://www.linuxquestions.org/questions/linux-newbie-8/bash-script-error-integer-expression-expected-934465/



回答5:

Try this:

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 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!