一、指令檔的產生
#!
/bin/bash
操作命令
#注釋
a
、指令檔的許可權,要求指令檔必須為具有可執行權
限。
#
chmod 755
指令檔名
b、指令檔的執行,要求指令檔所在的路徑應存在於$PATH路徑中。如果不存在於該路徑中,則指令檔的執行方式為:#./指令檔名
字串替換命令
1、tr,常用於管道操作中。對輸出內容的特定字串進行替換。
#命令 | tr ‘原字串’ ‘替換字串’
#命令 | tr -d ‘待刪除字串’ -d刪除字串
2、按特定的字串排序
#sort [-tkn ] 檔案名稱
-t 設定欄位分割符
-k 設定選取的欄位
-n 使用數字排序
例:#cat /etc/passwd | sort -t : -k 3 -n
3、過濾重複的資料--uniq
uniq用於對輸出內容中,相鄰的、重複的資料進行過濾,僅保留其中一個。
#命令 | uniq
#命令 | uniq -c 對找到的行進行統計
如果登入的BASH超過10個,則將前10個登入shell修改為csh。
4、雙重新導向—tee文法:tee將上一個檔案的標準輸出重新導向到檔案,並將標準輸出傳遞給下一個命令。例:#cut -d:-f 7 /etc/passwd | tee file1 | cat file15、xargs :是將第一個命令的輸出結果交給xargs後所帶的命令進行處理。例:ls a* | tee file1 | xargs rm –t例2:檔案刪除提示 read -p “請輸入你要刪除的檔案:” A ; ls $A | tee file1 | xargs rm –f | echo `cut file1`已被刪除 | echo ‘ ’ > file1
二、結構化控制語句
--
條件控制語句
1
、
if -- then --fi文法:if 命令(如果命令的傳回值為0,則執行then後的命令,否則、執行fi後的命令)例:判斷一個檔案是否存在 #!/bin/bash read -p “請輸入你要尋找的檔案:” A if ls $A then echo “該檔案存在” exit 0 fi exit 5
例2:判斷一個使用者是否存在 #!/bin/bash read -p “請輸入你要尋找的使用者帳號:” A if grep ^$A /etc/passwd then echo “該使用者存在” exit 0 fi exit 4
2
、
if – then -- else -- fi文法:if 命令(如果命令的傳回值為0,則執行then後的命令,否則、執行else後的命令)例:檔案建立指令碼 #!/bin/bash read -p “請輸入你要建立的檔案:” A if ls $A then echo “該檔案已存在” else touch $A fi
3
、
test
判斷文法:test 判斷條件(條件成立,則返回0,否則返回)判斷種類: n1 -ge n2 ; n1 >= n2 n1 -le n2 ; n1 <= n2 n1 -ne n2 ; n1 不等於!= n2 n1 -gt n2 ; n1 > n2 n1 -lt n2 ; n1 < n2例: #!/bin/bash if test 6 -gt 7 then echo “ok” else echo “error”註:在if中可以將test替換為[ ] 文法:if [ 判斷條件 ]判斷語句的符合檢查條件 文法:if [ 判斷條件 ] && [ 判斷條件 ]
檔案比較-d file ;檢查file檔案是否存在並且是一個目錄-e file ;檢查檔案或目錄是否存在(好用)-f file ;檢查檔案是否存在,並且是一個檔案-r file ;檢查檔案是否存在,並且是否可讀-s file;檢查檔案是否存在,並且是否不為空白-w file;檢查檔案是否存在,並且是否可寫入-x file;檢查檔案是否存在,並且是否可執行
例:輸入成績在60以下為不合格,60~80之間為合格,成績在80~90之間良好,90~100之間優秀,0以下或100以上胡扯;#!/bin/bash read -p “請輸入成績:” A elif [ $A –lt 60 ] && [ $A –ge 0 ] then echo “不及格” elif [ $A –ge 60 ] && [ $A –le 80 ] then echo “及格” elif [ $A -ge 81 ] && [ $A –le 90] then echo “良好” elif [ $A –ge 91 ] && [ $A –le 100 ] then echo “優秀” fi注L封口規則,有幾個if 就要在後面加幾個fi。elif除外,封口時用一個就ok )
if
的建立特性
文法:
if ((
數字運算式
))
例:IP種類判別指令碼
#!/bin/bash A = `ifconfig eth0 | head –n 2 | tail –n 1 | cut –d : -f2 | cut –d ‘ ’ –f 1` if (( $A >= 192 && $A <= 223 )) then echo “C類IP” elif (( $A <= 191 && $A >= 127 )) then echo “B類IP”…………fi
三、
列表定義
– case文法:case 變數名 in 變數值1 | 變數值2 ) 命令1 …… 變數值n | 變數值n* ) 命令n esac
例:#!/bin/bash read –p “where are you from :” A case $A in beijing | shanghai ) echo “你住502房間” ;; shanxi | hebei ) echo “你住在505” ;; guangdong | henan ) echo “你住在510房間” esac
四、迴圈命令
– for for 用於建立一個值列表實現重複迴圈,每次迴圈使用值列表的一個值文法:for 變數名 in 變數值列表 do 命令1 …… 命令N done
例:判斷根目錄下哪些是檔案哪些是目錄 #!/bin/bash for file in /boot/* do if [ -d $file ] then echo “ $file is a directary” elif [ -f $file ] then echo “is file” fi done
C式for迴圈文法:for (( 變數名=變數值 ;匹配條件;變數操作)) do 命令1 done例:列印100個數 #!/bin/bash for (( A=0;A<=100;A++)) do echo $A done 註:A=0(定義變數)A<=100(迴圈體執行條件) A++(變數操作)
for的嵌套迴圈 例: 列印九九乘法表 #!/bin/bash for (( L=1;L<=9;L++)) do echo “$L* $R=`echo $[$L*$R]`” done done例2、列印三角形 #!/bin/bash for ((h=1;h<=10;h++)) do for ((sn=1;sh*2-1>=sn;sn++)) do s=“$s `echo 0 `” done echo $s s= done
五、
while
迴圈文法:while test判斷(當test命令的傳回值為“0”時執行迴圈體) do 命令 doneWhile語句允許定義多條命令,每次迴圈均執行這些命令例:#!/bin/bash var1=10 while echo $var1 [ $var1 –ge 0 ] do echo “This is ” var1=$[$var1-1] done
六、until迴圈文法:until test(當test命令傳回值為非0時執行迴圈體) do 命令 done例:列印100個數 #!/bin/bash var1=100 until [ $var1 –eq 0 ] do echo $var1 var1=$[$var1-1] done
Shell指令碼樣本例1、while迴圈體,以特定的格式輸出系統中的使用者,第一個使用者是root,第二個使用者是…… #!/bin/bash while [ $n -le 1] do for test in `cut -d: -f1 /etc/passwd` do echo “第$n個使用者是:” $test n=$[$n+1] done done