我正在学习 shell 编程的基础知识,所以我写了一些简单的东西,比如
#!/bin/bash
read var1
read var2
if [ var1 -lt var2 ]; then
echo "var1 is lt var2"
else
echo "var2 is lt var1"
fi
我的理解是,变量在 Bash 中是无类型的,并且任何变量如果只包含数字,都可以用作整数。但是当我运行这个时,我收到错误“预期的整数表达式”......为什么?
答案1
declare
实际上,您可以使用(或旧的)内置函数在变量上设置一些属性typeset
。declare -i var1 var2
将在这些变量上设置整数属性。之后,尝试为这些变量设置非整数值的赋值将引发错误。
但你的问题出在语法上。使用变量的值时,必须在其名称前添加前缀$
:
if [ "$var1" -lt "$var2" ]; then
echo "$var1 is lt $var2"
else
echo "$var2 is lt $var1"
fi
算术评估是例外,不需要$
:
if ((var1<var2)); then
echo "$var1 is lt $var2"
else
echo "$var2 is lt $var1"
fi
作为警告,在[
..内部]
始终用双引号引用变量,以避免单词扩展扰乱表达式的语法。 (我的意思是,您将遇到未设置变量、包含空字符串的变量和包含IFS
字符的变量的问题。)或者您可以使用更新更好的[[
..]]
来正确处理此类情况:
if [[ $var1 -lt $var2 ]]; then
echo "$var1 is lt $var2"
else
echo "$var2 is lt $var1"
fi
答案2
您应该在名称前面引用变量$
if [ $var1 -lt $var2 ] ; then...