Bash:预期的整数表达式,使用读取/测试

7 bash arithmetic

我正在学习 shell 编程的基础知识,所以我写了一些简单的东西,比如

#!/bin/bash
read var1
read var2
if [ var1 -lt var2 ]; then
    echo "var1 is lt var2"
else
    echo "var2 is lt var1"
fi
Run Code Online (Sandbox Code Playgroud)

我的理解是变量在 Bash 中是无类型的,并且任何变量如果只包含数字就可以用作整数。但是当我运行它时,我收到错误“预期的整数表达式”......为什么?

man*_*ork 11

实际上,您可以使用declare(或旧的typeset)内置函数为变量设置一些属性。declare -i var1 var2将在这些变量上设置整数属性。之后,尝试为这些变量设置非整数值的赋值将引发错误。

但是您的问题在于语法。使用变量的值时,您必须在其名称前加上$

if [ "$var1" -lt "$var2" ]; then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi
Run Code Online (Sandbox Code Playgroud)

算术评估除外,其中不需要$

if ((var1<var2)); then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi
Run Code Online (Sandbox Code Playgroud)

作为警告,在[.. 中]始终双引号您的变量,以避免单词扩展弄乱您的表达式语法。(我的意思是,您会遇到未设置变量、包含空字符串的变量和包含IFS字符的变量的问题。)或者您可以使用更新更好的[[..]]来正确处理此类情况:

if [[ $var1 -lt $var2 ]]; then
    echo "$var1 is lt $var2"
else
    echo "$var2 is lt $var1"
fi
Run Code Online (Sandbox Code Playgroud)