歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

鳥哥的Linux私房菜Shell script 課後練習第十二章

ShellScript的優勢:

1、自動化管理的重要依據

2、追蹤與管理系統的重要工作

3、簡單入侵偵測功能

4、連續命令單一化

5、簡易的數據處理

6、跨平台支持與學習歷程較短

shellscript的文件後綴是.sh可以有如下兩個方法運行該文件

1、直接命令下達(必須有可讀可執行權限rx):

絕對路徑:使用 /home/dmtsai/shell.sh 來下達命令;

相對路徑:假設工作目錄在 /home/dmtsai/ ,則使用 ./shell.sh 來運行

變量『PATH』功能:將 shell.sh 放在 PATH 指定的目錄內,例如: ~/bin/

2、以 bash 程序來運行:透過『 bash shell.sh 』或『 sh shell.sh 』來運行

利用上面兩種方式運行腳本,會產生子程序,而利用source命令則可以讓腳本在父bash中運行

test 命令的測試功能

一些重要參數:

測試的標志 代表意義 1. 關於某個檔名的『文件類型』判斷,如 test -e filename 表示存在否 -e 該『檔名』是否存在?(常用) -f 該『檔名』是否存在且為文件(file)?(常用) -d 該『檔名』是否存在且為目錄(directory)?(常用) -b 該『檔名』是否存在且為一個 block device 裝置? -c 該『檔名』是否存在且為一個 character device 裝置? -S 該『檔名』是否存在且為一個 Socket 文件? -p 該『檔名』是否存在且為一個 FIFO (pipe) 文件? -L 該『檔名』是否存在且為一個連結檔? 2. 關於文件的權限偵測,如 test -r filename 表示可讀否 (但 root 權限常有例外) -r 偵測該檔名是否存在且具有『可讀』的權限? -w 偵測該檔名是否存在且具有『可寫』的權限? -x 偵測該檔名是否存在且具有『可運行』的權限? -u 偵測該檔名是否存在且具有『SUID』的屬性? -g 偵測該檔名是否存在且具有『SGID』的屬性? -k 偵測該檔名是否存在且具有『Sticky bit』的屬性? -s 偵測該檔名是否存在且為『非空白文件』? 3. 兩個文件之間的比較,如: test file1 -nt file2 -nt (newer than)判斷 file1 是否比 file2 新 -ot (older than)判斷 file1 是否比 file2 舊 -ef 判斷 file1 與 file2 是否為同一文件,可用在判斷 hard link 的判定上。 主要意義在判定,兩個文件是否均指向同一個 inode 哩! 4. 關於兩個整數之間的判定,例如 test n1 -eq n2 -eq 兩數值相等 (equal) -ne 兩數值不等 (not equal) -gt n1 大於 n2 (greater than) -lt n1 小於 n2 (less than) -ge n1 大於等於 n2 (greater than or equal) -le n1 小於等於 n2 (less than or equal) 5. 判定字串的數據 test -z string 判定字串是否為 0 ?若 string 為空字串,則為 true test -n string 判定字串是否非為 0 ?若 string 為空字串,則為 false。
注: -n 亦可省略 test str1 = str2 判定 str1 是否等於 str2 ,若相等,則回傳 true test str1 != str2 判定 str1 是否不等於 str2 ,若相等,則回傳 false 6. 多重條件判定,例如: test -r filename -a -x filename -a (and)兩狀況同時成立!例如 test -r file -a -x file,則 file 同時具有 r 與 x 權限時,才回傳 true。 -o (or)兩狀況任何一個成立!例如 test -r file -o -x file,則 file 具有 r 或 x 權限時,就可回傳 true。 ! 反相狀態,如 test ! -x file ,當 file 不具有 x 時,回傳 true

判斷符號中括號[]

利用中括號來判斷需要注意:

1、在中括號 [] 內的每個組件都需要有空白鍵來分隔;

2、在中括號內的變量,最好都以雙引號括號起來;

3、在中括號內的常數,最好都以單或雙引號括號起來。

shell scripts 的參數:

運行帶參數的shell scripts的格式:

/path/to/scriptname  opt1  opt2  opt3  opt4 

       $0                      $1      $2     $3     $4

除了上面之外還有一些內置的變量:

$# :代表後接的參數『個數』,以上表為例這裡顯示為『 4 』;

$@ :代表『 "$1" "$2" "$3" "$4" 』之意,每個變量是獨立的(用雙引號括起來);

$* :代表『 "$1c$2c$3c$4" 』,其中 c 為分隔字節,默認為空白鍵, 所以本例中代表『 "$1 $2 $3 $4" 』之意。

shift 會移動變量,而且 shift 後面可以接數字,代表拿掉最前面的幾個參數的意思。

單層簡單的條件判斷

if [ 條件判斷式 ]; then
	當條件判斷式成立時,可以進行的命令工作內容;
fi   <==將 if 反過來寫,就成為 fi 啦!結束 if 之意!

多重、復雜條件判斷式

# 一個條件判斷,分成功進行與失敗進行 (else)

if [ 條件判斷式 ]; then

當條件判斷式成立時,可以進行的命令工作內容;

else

當條件判斷式不成立時,可以進行的命令工作內容;

fi

# 多個條件判斷 (if ... elif ... elif ... else) 分多種不同情況運行

if [ 條件判斷式一 ]; then

當條件判斷式一成立時,可以進行的命令工作內容;

elif [ 條件判斷式二 ]; then

當條件判斷式二成立時,可以進行的命令工作內容;

else

當條件判斷式一與二均不成立時,可以進行的命令工作內容;

fi

利用 case ..... esac 判斷

語法:

case  $變量名稱 in   <==關鍵字為 case ,還有變量前有錢字號

  "第一個變量內容")   <==每個變量內容建議用雙引號括起來,關鍵字則為小括號 )

程序段

;;            <==每個類別結尾使用兩個連續的分號來處理!

  "第二個變量內容")

程序段

;;

  *)                  <==最後一個變量內容都會用 * 來代表所有其他值

不包含第一個變量內容與第二個變量內容的其他程序運行段

exit 1

;;

esac                  <==最終的 case 結尾!『反過來寫』思考一下!

function功能

function fname() {

程序段

}

回圈 (loop)

while [ condition ]  <==中括號內的狀態就是判斷式

do            <==do 是回圈的開始!

程序段落

done          <==done 是回圈的結束

until [ condition ]

do

程序段落

done

[root@www scripts]# vi sh13-2.sh 
#!/bin/bash
# Program:
#	Repeat question until user input correct answer.
# History:
# 2005/08/29	VBird	First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
 
until [ "$yn" == "yes" -o "$yn" == "YES" ]
do
	read -p "Please input yes/YES to stop this program: " yn
done
echo "OK! you input the correct answer."

[root@www scripts]# vi sh14.sh 
#!/bin/bash
# Program:
#	Use loop to calculate "1+2+3+...+100" result.
# History:
# 2005/08/29	VBird	First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
 
s=0  # 這是加總的數值變量 
i=0  # 這是累計的數值,亦即是 1, 2, 3.... 
while [ "$i" != "100" ]
do
	i=$(($i+1))   # 每次 i 都會添加 1  
	s=$(($s+$i))  # 每次都會加總一次! 
done
echo "The result of '1+2+3+...+100' is ==> $s" 

for...do...done (固定回圈)

for var in con1 con2 con3 ...

do

程序段

done

for (( 初始值; 限制值; 運行步階 ))

do

程序段

done

備注:

初始值:某個變量在回圈當中的起始值,直接以類似 i=1 配置好;

限制值:當變量的值在這個限制值的范圍內,就繼續進行回圈。例如 i<=100;

運行步階:每作一次回圈時,變量的變化量。例如 i=i+1。

shell script的debug

[root@www ~]# sh [-nvx] scripts.sh

選項與參數:

-n  :不要運行 script,僅查詢語法的問題;

-v  :再運行 sccript 前,先將 scripts 的內容輸出到螢幕上;

-x  :將使用到的 script 內容顯示到螢幕上,這是很有用的參數!

Copyright © Linux教程網 All Rights Reserved