課程大綱 『
Shell編程文法
Shell指令碼調試
Shell應用執行個體
』
一個簡單的shell程式
shell結構 :
1. #!指定執行指令碼的shell
2. #注釋行
3. 命令和控制結構
建立shell程式的步驟:
第一步 : 建立一個包含命令和控制結構的檔案。
第二步 : 修改這個檔案的許可權使它可以執行。
使用chmod u+x
第三步 : 執行 ./example
(也可以使用“sh example”執行)
Shell變數
變數 : 是shell傳遞資料的一種方法,用來代表每個取值的符號名。
Shell有兩類變數 : 臨時變數 和 永久變數。
臨時變數是shell程式內部定義的,其使用範圍僅限於定義它的程式,對其它程式不可見。包括:使用者自訂變
量、位置變數。永久變數是環境變數,其值不隨shell指令碼的執行結束而消失。
使用者自訂變數
使用者定義的變數由字母或底線開頭,由字母、數字或底線序列組成,並且大小寫字母意義不
同。變數名長度沒有限制。在使用變數值時,要在變數名前加上首碼“$”。
設定和使用變數
設定變數 : 習慣上用大寫字母來命名變數。變數名只能以字母表中的字元開頭,不能用數字。
變數賦值 : 賦值號“=”兩邊應沒有空格。定義時賦值,如 NUM = 1 將一個命令的執行結果賦給變數,如:TIME=`date`
將一個變數賦給另一個變數,如:A =$B使用echo命令查看變數值。例如:echo $A
列出所有的變數:
# set
包含多個字的變數:
$NAME=Mike Ron
運行時出錯,應改為 : $NAME=“Mike Ron” 或 $NAME=‘Mike Ron’
單引號和雙引號的區別 :
# $ABC=‘$NAME Junior’
# echo $ABC
$NAME Junior
單引號之間的內容原封不動地指定給了變數。
刪除變數 : # unset NAME
位置變數和特殊變數
Shell解釋執行使用者命令時,將命令列的第一個部分作為命令名,其它部分作為參數。由出現
在命令列上的位置確定的參數稱為位置參數。
例如 : ls -l file1 file2 file3
$0 這個程式的檔案名稱 ls -l
$n 這個程式的第n個參數值,n=1-9
特殊變數
$* 這個程式的所有參數
$# 這個程式的參數個數
$$ 這個程式的PID
$! 執行上一個後台命令的PID
$? 執行上一個命令的傳回值
Shell命令
*1 read命令 : 從鍵盤讀入資料,賦給變數 如 : read USERNAME
read 的例子:
#! /bin/sh
read first second third
echo "the first parameter is $first"
echo "the second parameter is $second”
echo "the third parameter is $third"
expr 命令
Shell變數的算術運算:
expr命令:對整數型變數進行算術運算
例如 : expr 3 + 5
expr $var1 - 5
expr $var1 / $var2
expr $var3 \* 10
複雜的expr命令
複雜的運算:
expr `expr 5 + 7`/$var4
將運算結果賦予變數:
var4=` expr $var1 / $var2 `
expr 命令
#!/bin/sh a=10 b=20 c=30 value1=`expr $a + $b + $c` echo "The value of value1 is $value1" value2=`expr $c / $b` echo "The value of value2 is $value2" value3=`expr $c \* $b` echo "The value of value3 is $value3" value4=`expr $a + $c / $b` echo "The value of value4 is $value4“
變數測試語句
變數測試語句:用於測試變數是否相等、 是否為空白、檔案類型等。
格式 : test 測試條件
測試範圍 : 整數、字串、檔案
*1 字串測試:
test str1=str2 測試字串是否相等
test str1!=str2 測試字串是否不相等
test str1 測試字串是否不為空白
test -n str1 測試字串是否不為空白
test -z str1 測試字串是否為空白
*2 整數測試:
test int1 -eq int2 測試整數是否相等
test int1 -ge int2 測試int1是否>=int2
test int1 -gt int2 測試int1是否>int2
test int1 -le int2 測試int1是否<=int2
test int1 -lt int2 測試int1是否<int2
test int1 -ne int2 測試整數是否不相等
*3 檔案測試:
test -d file 指定檔案是否目錄
test -f file 指定檔案是否常規檔案
test -x file 指定檔案是否可執行
test -r file 指定檔案是否可讀
test -w file 指定檔案是否可寫
test -a file 指定檔案是否存在
test -s file 檔案的大小是否非0
變數測試語句一般不單獨使用,一般做為if語句的測試條件,如:
if test -d $1 then
...
fi
變數測試語句可用[]進行簡化,如
test -d $1 等價於 [ -d $1 ]
#!/bin/sh if [ $# -ne 2 ]; then echo "Not enough parameters" exit 0 fi if [ $1 -eq $2 ]; then echo "$1 equals $2" elif [ $1 -lt $2 ]; then echo "$1 littler than $2" elif [ $1 -gt $2 ]; then echo "$1 greater than $2" fi
流量控制語句
流量控制語句 : 用於控制shell程式的流程
exit語句 : 退出程式執行,並返回一個返回碼,返回碼為0表示正常退出,非0表示非正常退出。
例如:exit 0
*1 if 的使用
if ...then ...fi語句, 例如 :
#!/bin/sh if [ -x /etc/rc.d/init.d/httpd ] then /etc/rc.d/init.d/httpd restart fi
*2 更複雜的if語句 :
if 條件1 then
命令1
elif 條件2 then
命令2
else
命令3
fi
*3 多個條件的聯合:
-a : 邏輯與,僅當兩個條件都成立時,結果為真。
-o : 邏輯或,兩個條件只要有一個成立,結果為真。
*4 for...done語句
格式:for 變數 in 名字表
do
命令列表
done
例子:
#!/bin/sh for DAY in Sunday Monday Tuesday Wednesday Thursday Friday Saturday do echo "The day is : $DAY" don
*5 select 變數 in 關鍵字
do
command 1
... ...
command n
done
select把關鍵字中的每一項做成類似表單,以互動的方式執行do和done之間的命令。
*6 case...esac語句,格式:
case 變數 in
字串1) 命令列表1
;;
...
字串n) 命令列表n
;;
esac
*7 while語句,格式:
while 條件 do 命令 done #! /bin/sh num=1 while [ $num -le 10 ] do SUM=`expr $num \* $num` echo $SUM num=`expr $num + 1` done
*8 until語句,格式:
until 條件
do
命令
done
until類似while迴圈,不同的是until是條件傳回值為假時才繼續執行
*9 跳出迴圈:break和continue
break : 跳出整個迴圈
continue : 跳過本次迴圈,進行下次迴圈
*10
shift指令:參數左移,每執行一次,參數序列順次左移一個位置,$#的值減1,
用於分別處理每個參數,移出去的參數不再可用
*11 函數的定義:
函數名 ()
{
命令序列
}
函數的調用:不帶()
函數名 參數1 參數2 ...
*12 函數中的變數:
變數均為全域變數, 沒有局部變數
函數中的參數 : 調用函數時,可以傳遞參數,在函數中用$1、$2...來引用
*13 sh -x script
這將執行該指令碼並顯示所有變數的值。
sh -n script
不執行指令碼只是檢查文法的模式,將返回所有語法錯誤。
*14 awk命令應用
awk -F 域分隔字元 ‘命令’
樣本 :
1、檢測系統中UID為0的使用者
awk -F: '$3==0 {print $1}' /etc/passwd
2、檢測系統中密碼為空白的使用者
awk -F: 'length($2)==0 {print $1}' /etc/shadow
知識點總結
掌握Shell編程的基本文法
掌握結合系統命令編寫應用指令碼
掌握Shell編程調試命令