shell程式設計控制結構expr/let/for/while/until

markzy5201190發表於2013-01-30
1、expr計算整數變數值
格式 :expr arg
例子:計算(2+3)×4的值
1、分步計算,即先計算2+3,再對其和乘4
s=`expr 2 + 3`
expr $s \* 4
2、一步完成計算:
expr  `expr 2 + 3 `  \* 4
–說明:
運算子號和引數之間要有空格分開;
萬用字元號(*),在作為乘法運算子時要用\、“”、‘’符號修飾
–:expr 3 \* 2         expr 3 “*” 2       expr 3 ‘*’ 2 
 `(反引號)與鍵盤上的~同一個鍵上的符號 
 
[fsy@localhost ~]$ s=`expr 2 + 3`
[fsy@localhost ~]$ echo $s
5
[fsy@localhost ~]$ expr $s \* 4
20
[fsy@localhost ~]$ expr `expr 2 + 3` \* 4
20
[fsy@localhost ~]$ expr 2 \* 3
6
[fsy@localhost ~]$ expr 2 "*" 3
6
[fsy@localhost ~]$ expr 2 '*' 3
6
[fsy@localhost ~]$ expr 2 * 3
expr: 語法錯誤
[fsy@localhost ~]$
 
2、let命令
格式:let arg1 [arg2 ......]
說明:
與expr命令相比,let命令更簡潔直觀
 [ ]表示可以有多個引數,arg n (n=1,2…)
 運算子與運算元據之間不必用空格分開,但表示式與表示式之間必須要用空格分開
當運算子中有、&、|等符號時,同樣需要用引號(單引號、雙引號)或者斜槓來修飾運算子
–例子:計算(2+3)×4的值
[fsy@localhost ~]$ let s=(2+3)*4
[fsy@localhost ~]$ echo $s
20
[fsy@localhost ~]$
3、for語句——坑爹的開始...... 和其他語言的for不同!
對一組引數進行一個操作
語法格式:
 
for 變數 in 列表
do
命令列(通常用到迴圈變數)
done
說明:
–“列表”為儲存了一系列值的列表,隨著迴圈的進行,變數從列表中的第一個值依次取到最後一個值;
–do和done之間的命令通常為根據變數進行處理的一系列命令,這些命令每次迴圈都執行一次;
–如果“ in 列表”部分省略掉,Bash則認為是“in $@”,即執行該程式時通過命令列傳給程式的所有引數的列表。
例1、自定義列表
#!/bin/bash
for var in one two three four five
        do
                echo ------
                echo '$var is' $var
        done
 
執行輸出:
------
$var is one
------
$var is two
------
$var is three
------
$var is four
------
$var is five
例2、以命令返回值作為列表
#!/bin/bash
for var in `ls`
        do
                echo -----
                echo $var
        done
           
執行輸出:
-----
abb
-----
abc
-----
a.out
-----
a.sh
-----
b.sh
-----
hello.c
-----
scripts
-----
例3、命令列引數指定為列表中的數值
#!/bin/bash
for var
        do
                echo "It's $var"
        done
執行輸出:
[fsy@localhost ~]$ sh c.sh a b c d
It's a
It's b
It's c
It's d
4、while語句
語法格式:
while      表示式 
do
命令列
done
說明:
–while迴圈中,只要條件為真,就執行do和done之間的迴圈命令;
–避免生成死迴圈。
 
例如:
#!/bin/bash
num=1
while [ $num -le 10 ]
do
echo -e "\t the num is $num"
let num=num+1
done
執行輸出:
 the num is 1
 the num is 2
 the num is 3
 the num is 4
 the num is 5
 the num is 6
 the num is 7
 the num is 8
 the num is 9
 the num is 10
 
5、until語句
語法格式:
unitil      表示式 
    do
命令列
    done
說明:
–until迴圈中,只要條件不為真,就執行do和done之間的迴圈命令,或者說,在until迴圈中,一直執行do和done之間的迴圈命令,直到條件為真;
–避免生成死迴圈。
例:計算1到10的和
#!/bin/bash
sum=0
num=10
until test $num -eq 0
        do
                sum=`expr $sum + $num`
                num=`expr $num - 1`
        done
echo "sum = $sum"
執行輸出
 
sum = 55
6、shift語句
shift語句:將變數的值依次向左傳遞,並形成一組新的引數值
–例:位置變數當前值為:1=file1 2= file2 3=file3
–        執行一次shift後為:1=file2 2=file3
還可以在shift命令中指定位置變數轉移的次數
–shift n
 
例:
#!/bin/bash
while [ -n "$*" ]
        do
                echo $1 $2 $3 $4 $5 $6
                shift
        done
執行輸出
[fsy@localhost scripts]$ sh b.sh 1 2 3 4 5 6 7
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7
4 5 6 7
5 6 7
6 7
7
7、if語句
if 語句的一般形式 :
if   條件表示式
then  #當條件為真時執行以下語句
         命令列表
else #當條件為假時執行以下語句
         命令列表
fi
  if的測試部分利用test命令實現,也可以利用一般命令執行成功與否來判斷。如果命令正常結束,返回值為0,條件測試為真; 否則返回值不為0,條件測試為假
例:
#!/bin/bash
if test -f "$1"
        then
        echo "$1 is an ordinary file"
else
        echo "$1 is not an ordinary file"
fi
執行輸出:
[fsy@localhost scripts]$ sh c.sh abb
abb is not an ordinary file
[fsy@localhost scripts]$ sh c.sh a.sh
a.sh is an ordinary file
[fsy@localhost scripts]$ 
8、case語句
   取值後面必須為單詞in,每一個模式必須以右括號結束。取值可以為變數或常數。取值檢測匹配的每一個模式,一旦模式匹配,其間所有命令開始執行直至;;。執行完匹配模式相應命令後不再繼續其他模式。如果無一匹配模式,使用*號捕獲該值,再接受其他輸入。
 
[注]
1.模式字串中可以使用萬用字元
2.如果一個模式字串中包含多個模式,那麼各模式之間應以豎線(|)隔開,表各模式是“或”的關係,即只要給定字串與其中一個模式相配,就會執行其後的命令列表。
3.各模式字串應是唯一的,不應重複出現,並且要合理安排它們的出現順序,例如,不應將“*”作為頭一個模式字串,因為“*”可以與任何字串匹配,若第一個出現,就不會再檢查其他模式了。
4.case語句以關鍵字case開頭,以關鍵字esac結束。
5.case的退出(返回)值是整個結構中最後執行的命令的退出值。若沒有執行任何命令,則退出值為0.
 
例:
#!/bin/bash
case $1 in
1)
        echo " you choice is 1";;
2)
        echo " your choice is 2";;
*)
        echo " your choice is others";;
esac
執行輸出:
[fsy@localhost scripts]$ sh d.sh 1
 you choice is 1
[fsy@localhost scripts]$ sh d.sh 2
 your choice is 2
[fsy@localhost scripts]$ sh d.sh 3
 your choice is others
9、break與continue
–1、break:用於立即終止當前迴圈的執行,break命令可以使使用者從迴圈體中退出來。
–語法:break[n] ,其中,n表示要跳出幾層迴圈,預設值為1
–2、continue:跳過迴圈體中在其之後的語句,會返回到本迴圈層的開頭,進行下一次迴圈。
–語法:continue[n],其中,n表示從包含continue語句的最內層迴圈體向外跳到第幾層迴圈,預設值為1,迴圈層數是由內向外編號。
 
10、函式
  函式:由函式標題和函式體兩部分組成。標題是函式名。函式體是函式內在的命令集合。標題名稱必須唯一。變數均為全域性變數,沒有區域性變數。
格式:
 [function] 函式名()             或   [function]函式名() {
                 {                                                         命令1
                  命令1                                                  …
                    …                                                       }
                  }
例:
#!/bin/bash
num=1
hello()
{
        echo "hello boy~ It's our $num meeting"
        let num=num+1
}
hello
hello
hello
執行輸出
hello boy~ It's our 1 meeting
hello boy~ It's our 2 meeting
hello boy~ It's our 3 meeting
 
11、select語句
格式:
select 變數 in 列表
do
命令列(通常用到迴圈變數)
done
 
    製作一個選擇表,在列表中選擇一個選項執行命令列。如果選擇的變數不在列表序列中,則返回一個空值。需要用break退出迴圈。
 
例子:
#!/bin/bash
echo "a is 5 ,b is 3. Please select your method: "
a=5
b=3
select var in "a+b" "a-b" "a*b" "a/b"
do
        break
done
case $var in
"a+b")
        echo 'a+b= '`expr $a + $b`;;
"a-b")
        echo 'a-b= '`expr $a - $b`;;
"a*b")
        echo 'a*b= '`expr $a \* $b`;;
"a/b")
        echo 'a/b= '`expr $a / $b`;;
*)
        echo "input error"
esac
執行輸出:
[fsy@localhost scripts]$ sh e.sh
a is 5 ,b is 3. Please select your method: 
1) a+b
2) a-b
3) a*b
4) a/b
#? 1
a+b= 8

zz:http://blog.csdn.net/fansongy/article/details/6724228

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26855487/viewspace-753551/,如需轉載,請註明出處,否則將追究法律責任。

相關文章