在使用 shell 的 test 命令處理算術條件表達式時,總讓我覺得這個命令是個垃圾。例如
#!/bin/bash
var=5
if [ "$var" -gt 0 -a "$var" -lt 10 ]; then
echo "var is $var"
else
echo "var is not in range"
fi
我在關於shell的test命令格式的各種疑惑這篇文章中,解釋了爲何test 命令的兩個括號內側要加上空格,爲何操作符也要用空格進行分隔。
這些限制讓我寫代碼畏首畏腳,那麼有沒有辦法能避免 test 命令針對算術條件表達式的弊端呢?當然有,最常見的是 bash 提供的一個條件結構((arithmetic expression))
。那麼上面的腳本可以改寫如下
#!/bin/bash
var=5
if ((var>0&&var<10)); then
echo "var is $var"
else
echo "var is not in range"
fi
從這個腳本中可以看到,((arithmetic expression))
這個條件結構有哪些特性
- 引用變量的值,不需要前綴的美元符號。
- 不再需要任何空格。
你能在高級語言中使用的算術運算,基本都可以使用 (())
這個條件結構來完成,例如變量自動遞增,變量賦值等等。
那麼爲何(())
不需要使用空格進行分隔呢?據我猜測,((
和))
是元字符,而元字符本來就起到了分隔作用。可見 bash 對 shell 的改進,有時真讓人腦殼疼。但是我們可以爲了美觀效果,也加上空格進行分隔。這樣就不會有任何煩惱了。
通過一個例子來了解條件結構的用法,如下腳本將會顯示執行腳本時傳入的參數
#!/bin/bash
count=1
# (())執行算術條件判斷
while (( $# > 0 )); do
echo "Arguments #$count = $1"
# (())執行變量遞增,這些最簡潔的寫法
((count++))
# let 命令等價於(())
#let count++
shift
done