bash的算術表達式結構:解決一切算術表達式的煩惱

在使用 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))這個條件結構有哪些特性

  1. 引用變量的值,不需要前綴的美元符號。
  2. 不再需要任何空格。

你能在高級語言中使用的算術運算,基本都可以使用 (()) 這個條件結構來完成,例如變量自動遞增,變量賦值等等。

那麼爲何(())不需要使用空格進行分隔呢?據我猜測,(())是元字符,而元字符本來就起到了分隔作用。可見 bash 對 shell 的改進,有時真讓人腦殼疼。但是我們可以爲了美觀效果,也加上空格進行分隔。這樣就不會有任何煩惱了。

通過一個例子來了解條件結構的用法,如下腳本將會顯示執行腳本時傳入的參數

#!/bin/bash

count=1
# (())執行算術條件判斷
while (( $# > 0 )); do
	echo "Arguments #$count = $1"
	# (())執行變量遞增,這些最簡潔的寫法
	((count++))
	# let 命令等價於(())
	#let count++
	shift
done
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章