2013年5月24日 星期五

Bash/Dash Shell Script 當中的邏輯判斷

首先是函式的例子:
#!/bin/sh

yes_func()
{
    echo yes_func
    true
}

no_func()
{
    echo no_func
    false
}
                                
if ! yes_func || yes_func; then
    echo two yes_func
fi

if ! no_func && ! no_func; then
    echo two no_func
fi

驚歎號 '!' 是真假值反相的運算,要與函式名稱之間用空白隔開,否則會成為函式名稱的一部份。

另外就是「且」邏輯運算 '&&' 與「或」邏輯運算 '||' 的執行優先序都比反相邏輯運算 '!' 還要低。

接下來是數值的例子:
#!/bin/sh

NUM=5

if [ $NUM -eq 5 ]; then
    echo "#$NUM == 5"
else
    echo "#$NUM != 5"
fi

if [ $NUM -ne 5 ]; then
    echo "#$NUM != 5"
else
    echo "#$NUM == 5"                     
fi

if [ $NUM -gt 0 -a $NUM -lt 10 ]; then
    echo "0 < #$NUM < 10"
fi

NUM=11

if [ ! $NUM -gt 0 -o ! $NUM -lt 10 ]; then
    echo "#$NUM <= 0 or #$NUM >= 10"
fi

if [ $NUM -le 0 -o $NUM -ge 10 ]; then
    echo "#$NUM <= 0 or #$NUM >= 10"
fi

if [ ! $NUM -lt 0 -a $NUM -gt 10 ]; then
    echo "#$NUM >= 0 and #$NUM > 10"
fi

if [ $NUM -ge 0 -a $NUM -gt 10 ]; then
    echo "#$NUM >= 0 and #$NUM > 10"
fi

數值的算數運算子有:

  • '-eq' 等於 '=='
  • '-ne' 不等於 '!='
  • '-lt' 小於 '<'
  • '-gt' 大於 '>'
  • '-le' 小於或等於 '<='
  • '-ge' 大於或等於 '>='

而 '-a' 相當於前面提過的「且」邏輯運算 '&&','-o' 則是相當於「或」邏輯運算 '||',同樣地優先序都比反相邏輯運算 '!' 還要低。

最後是是否為空字串的例子:
#!/bin/sh

STR1="foo"
STR2=""

if [ ! -z "$STR1" -a -z "$STR2" ]; then
    echo "'$STR1' is not empty, and '$STR2' is empty."
fi

if [ -n "$STR1" -a -z "$STR2" ]; then
    echo "'$STR1' is not empty, and '$STR2' is empty."
fi

if [ -z "$STR1" -o -z "$STR2" ]; then
    echo "'$STR1' is empty, or '$STR2' is empty."
fi

STR1="foo"
STR2="bar"

if [ ! -z "$STR1" -a ! -z "$STR2" ]; then
    echo "'$STR1' is not empty, and '$STR2' is not empty."
fi

STR1=""
STR2=""

if ! [ -n "$STR1" -o -n "$STR2" ]; then
    echo "'$STR1' is empty, and '$STR2' is empty."
fi

if [ -z "$STR1" -a -z "$STR2" ]; then
    echo "'$STR1' is empty, and '$STR2' is empty."
fi                                                        

'-z' 是否為空字串的運算子,'-n' 是否為非空字串的運算子。

跟前面的數值運算一樣都需要用中括號包起來使用,另外就是反相邏輯運算 '!' 可以直接使用在中括號的運算結果。

張貼留言