next up previous contents
Next: File descriptor與I/O導向 Up: 重要外部與內建命令 Previous: xargs   Contents

簡單數學

主要是拿來作counter的,有很多種方法,下面介紹三種, bash有個內建的let, 例如
let 'x = x + 1'
let 'x = x * 1'
注意!!這邊等號右邊的x取值時不用加錢符號,而且在單quote內也可以有空格。 ksh也有內建的,不過這不是每種shell都有的, 比較保險的portable作法是用expr這個外部命令。 請看例子
 if [ "$KSH" ]
 then
        eval '
        add()
        {
                result=$((${1} + ${2}))
        }
        sub()
        {
                result=$(($1 - $2))
        }
        mul()
        {
                result=$(($1 * $2))
        }
        div()
        {
                result=$(($1 / $2))
        }
        inc()
        {
                eval "$1=\$((\${$1} + ${2:-1}))"
        }
        dec()
        {
                eval "$1=\$((\${$1} - ${2:-1}))"
        }
        '
else
        add()
        {
                result=`expr $1 + $2`
        }
        mul()
        {
                result=`expr $1 * $2`
        }
        div()
        {
                result=`expr $1 / $2`
        }
        sub()
        {
                result=`expr $1 - $2`
        }
        inc()
        {
                eval "$1=\`expr \${$1} + ${2:-1}\`"
        }
        dec()
        {
                eval "$1=\`expr \${$1} - ${2:-1}\`"
        }
這上面定義了一些副程式,可以在script裡面一樣像呼叫一般命令呼叫。 $((1+1))是一個subshell執行1+1並且傳回結果,下面例子讓我想起我的basic程式
     i=0
     while [ $((i=$i+1)) -lt 10 ]; do echo $i; done
不過$(( ))這跟${VAR%value}一樣只有ksh bash有,最好不要用在需要 portable 的shell程式上。 副程式的position parameters $1, $2 ....跟平常script程式原則一樣。

如果要更多的數學例如小數點的運算或者sin log等函數使用, 就用bc和awk吧。

ksh與bash都支援typeset,不過傳統的sh並不支援,bash還有declare這個內部命令, 這兩個都是拿來定義這個變數是甚麼性質的很像C的宣告。不過為了portable能不用 就不要用,還是用最基本的sh就好,如果真的要寫得很複雜就用perl吧,如果非常的 嚴謹就用C囉。
      $ typeset -i int_var
      $ declare -r constant
int_var被設成整數,如果給字串則int_var的值會是0。如果用-r 則constant的值從現在起不能再被改了。



Cyril Huang 2002-06-14