Linux Shell編程學習筆記(4)

Linux Shell編程學習筆記(2015-7-20)

分類:linux shell

  今天學習了Linux Shell中的控制結構。其實大多數語言的控制結構這一塊都是基本類似的,有了C語言的基礎之後,對於shell中的控制結構是可以很快掌握的。

一:條件測試

  在C語言中無論是while,do…while,for這些控制語句裏都含有條件測試語句。可以說在控制開始或者控制過程中條件測試都是必不可少的部分。

1.test命令

  條件測試命令test用於評估表達式的值以便進行條件控制。test命令有兩種書寫格式。分別如下:
test 表達式
或者
[ 表達式 ]
  test命令評估表達式參數,如果表達式的值爲真,其退出狀態爲0(成功),否則退出狀態爲1(失敗)。
注意:使用方括號時,“[”右邊和“]”左邊各需要至少一個空格。
比如:

biantiao@lazybone1994-ThinkPad-E430:~$ cd sh
biantiao@lazybone1994-ThinkPad-E430:~/sh$ test "3" \> "2" ; echo $?
0
biantiao@lazybone1994-ThinkPad-E430:~/sh$ test "2" \> "3" ; echo $?
1
biantiao@lazybone1994-ThinkPad-E430:~/sh$

  test命令可以和多種系統運算符一起使用。這些運算符可以分成4類:文件屬性測試運算符,字符串測試運算符,數值測試運算符和邏輯測試運算符。至於這些具體的測試運算符是沒有必要去記憶的,在實際的編程中遇到了直接去查閱手冊就好了。

2.let命令

  test命令很強大,但只能執行算術比較運算且書寫繁瑣,爲此,bash提供了專門執行整數算術運算的let命令,其語法格式爲:
let 算術表達式..
或者
((算術表達式))
  如果算術表達式求值爲0,則設置退出狀態爲1;如果求值爲0值,則退出狀態爲0。比如:

biantiao@lazybone1994-ThinkPad-E430:~$ let x=2 y=2**3 z=y*3 ; echo $? $x $y $z
0 2 8 24
biantiao@lazybone1994-ThinkPad-E430:~$let x=8%2 ; echo $? $x
1 0

  let命令除了提供了基本的算術運算符外,它還提供了幾個C語言中沒有的運算符如下表所示:

註明:因爲按位或的符號在Markdown中無法被轉義,故用的中文來說明。感覺自己好low啊!   o(╯□╰)o 如果誰有好的辦法還請告知我,感激不盡!

運算符 功能
! 邏輯非
~ 按位取反
& 按位與
^ 按位異或
就是一條豎線 按位或

技巧:
- 使用(())形式時,即使表達式中有shell的特殊字符,也不必用雙引號將其括起來。比如:

biantiao@lazybone1994-ThinkPad-E430:~$ let "v = 6 | 5" ; echo $v
7
biantiao@lazybone1994-ThinkPad-E430:~$ let v = 6 | 5 ; echo $v
bash: let: =: 語法錯誤: 需要操作數 (錯誤符號是 "=")
5:未找到命令
7
biantiao@lazybone1994-ThinkPad-E430:~$ ((v = 6 | 5)) ; echo $v
7
biantiao@lazybone1994-ThinkPad-E430:~$
  • 使用“$((表達式))”形式可以返回算術表達式的確切值,而不是let命令的退出碼。並將其返回值賦值給其它變量。例如:
biantiao@lazybone1994-ThinkPad-E430:~$ v=$((1 + 2)) ; echo $? ; echo $v
0
3
biantiao@lazybone1994-ThinkPad-E430:~$

3.“[[ ]]”測試

  同“(( ))”一樣,該命令可以對文件名和字符串使用更自然的語法,其中的特殊字符不用轉義。在該命令中,還允許使用括號和邏輯操作符“&&”和“||”把test命令支持的測試組合起來。比如:

biantiao@lazybone1994-ThinkPad-E430:~$ [[ ( -d "$HOME" ) && ( -w "$HOME" ) ]] && echo "home is a writable dir ectory"
home is a writable dir ectory
biantiao@lazybone1994-ThinkPad-E430:~$

二:控制語句

  shell的控制語句所完成的功能與C語言中的控制語句相同,唯一的區別是它們的表達形式不一樣。

if語句

if 測試條件1
then
    命令組1
[elif 測試條件2]
[then
    命令組2]
[else
    命令x]
fi

說明:其中在方括號中的是可選的,按需選擇。舉個例子:

biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat if.sh
#! /bin/bash

echo 'type in the user name.'
    read user
if grep $user /etc/passwd > /tmp/null && who | grep $user
then
    echo "$user has logged in the system"
    cp /tmp/null ~/me.tmp
    rm /tmp/null
else
    echo "$user has not logged in the system"
fi

biantiao@lazybone1994-ThinkPad-E430:~/sh$ chmod a+x if.sh
biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./if.sh
type in the user name.
biantiao
biantiao :0           2015-07-20 07:25 (:0)
biantiao pts/3        2015-07-20 13:34 (:0.0)
biantiao has logged in the system
biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./if.sh
type in the user name.
lazybone1994
lazybone1994 has not logged in the system
biantiao@lazybone1994-ThinkPad-E430:~/sh$

case語句

case 字符串 in
模式字符串1) 命令
               命令
               命令
               ...
               命令;;
模式字符串2) 命令
               命令
               命令
               ...
               命令;;
...
模式字符串n) 命令
               命令
               命令
               ...
               命令;;
esac

比如:

biantiao@lazybone1994-ThinkPad-E430:~$ cd sh
biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat case.sh
#! /bin/bash

echo "Pleae input the file name."
read name

echo "Please chose either 1, 2 or 3."
echo "[1]ls -l $name"
echo "[2]cat $name"
echo "[3]quit"

read response
case $response in
1)  ls -l $name;;
2)  cat $name;;
3)  echo "good bye."
esac

biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./case.sh
Pleae input the file name.
case.sh
Please chose either 1, 2 or 3.
[1]ls -l case.sh
[2]cat case.sh
[3]quit
2
#! /bin/bash

echo "Pleae input the file name."
read name

echo "Please chose either 1, 2 or 3."
echo "[1]ls -l $name"
echo "[2]cat $name"
echo "[3]quit"

read response
case $response in
1)  ls -l $name;;
2)  cat $name;;
3)  echo "good bye."
esac

biantiao@lazybone1994-ThinkPad-E430:~/sh$ 

說明:模式字符串可以使用通配符。如果一個模式字符串中包含了多個模式,那麼各模式之間應該以豎線隔開(|)表示各模式是“或”的關係。比如:

biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat m.sh
#! /bin/bash

read choice
case $choice in
time | date)    echo "the time is `date`.";;
dir | path)     echo "current directory is `pwd`.";;
*)      echo "bad argument."
esac

biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./m.sh
time
the time is 20150720日 星期一 14:00:10 CST.
biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./m.sh
date
the time is 20150720日 星期一 14:00:17 CST.
biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./m.sh
dir
current directory is /home/biantiao/sh.
biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./m.sh
path
current directory is /home/biantiao/sh.
biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./m.sh
kkh
bad argument.
biantiao@lazybone1994-ThinkPad-E430:~/sh$ 

while語句

while 測試條件
do
    命令表
done

until語句

until 測試條件
do
    命令表
done

說明:until語句與while語句很相似,只是測試條件不同。until語句中,只有當測試條件爲假時才執行循環體中的命令表,直到測試條件爲真時終止循環。

for語句

for語句的值表達方式

for 變量 [in 值表]
do
    命令表
done

舉個例子:

biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat for.sh
#! /bin/bash
student=(張三 李四 王五 LazyBone1994)
for name in "${student[@]}"
do
    echo $name
done

biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./for.sh
張三
李四
王五
LazyBone1994
biantiao@lazybone1994-ThinkPad-E430:~/sh$ 

for語句的算術表達方式

說明:該方式和C語言當中的for語句及其類似。

for ((e1; e2; e3)) ; do
    命令表
done

舉個例子:

biantiao@lazybone1994-ThinkPad-E430:~/sh$ cat for1.sh
#! /bin/bash

echo "輸入要打印的行數:"
read n
for ((i = 1; i <= n; i++)) ; do
    for ((j = 1; j <= i; j++)) ; do
        echo -n "* "
    done
    echo ""
done

biantiao@lazybone1994-ThinkPad-E430:~/sh$ ./for1.sh
輸入要打印的行數:
6
*
* *
* * *
* * * *
* * * * *
* * * * * *
biantiao@lazybone1994-ThinkPad-E430:~/sh$

break,continue和exit語句

  • break命令的作用是退出循環體,其語法格式是:

break [n]
說明:其中n爲一整數,表示要跳出幾層循環。

  • continue命令的作用是跳過本次循環中在它之後的循環體語句,回到本層循環的開頭,進行下一次循環。其語法是:

continue [n]
說明:其中n表示包含continue語句的最外層循環體向外跳出基層循環,默認值爲1.

  • exit命令的功能是立即退出正在執行的shell腳本,並設定退出狀態。其語法格式爲:

exit [n]
說明:n是設定的退出狀態。如果未顯示給出n值,則退出狀態爲最後一個命令的執行狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章