![Bash:需要整數表達式,使用讀取/測試](https://rvso.com/image/23940/Bash%EF%BC%9A%E9%9C%80%E8%A6%81%E6%95%B4%E6%95%B8%E8%A1%A8%E9%81%94%E5%BC%8F%EF%BC%8C%E4%BD%BF%E7%94%A8%E8%AE%80%E5%8F%96%2F%E6%B8%AC%E8%A9%A6.png)
我正在學習 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...