今天我將shell腳本的基本編寫語法學習心得與大家一起分享,請大家多多指點
腳本的作用使得我們的任務能夠成批量自動完成,而不用我們再一個個的手動執行,腳本的編寫語言有很多中,比如c,c++,c#,perl,shell等等,今天我們主要學習的就是shell腳本的編寫,而腳本的編寫是遵從一定的語言法則,下面我們就重點說明一下shell腳本的幾種常用語言:if,for,case,while,until
腳本中經常使用的比較變量:
字符串比較:
==:如果兩個字符串相等,則爲是
!=:如果兩個字符串不想等,則爲是
-n:如果字符串的長度大於零,則爲是
-z:如果字符串的長度等於零,則爲是
數字的比較:
-eq:兩個數字相等。則爲是
-ge:$1大於等於$2,則爲是
-le:$1小於等於$2,則爲是
-ne:兩個數字不想等,則爲是
-gt:$1大於$2,則爲是
-lt:$1小於$2,則爲是
文件比較:
-d:對象存在且是目錄,則爲是
-f:對象存在且是普通文件,則爲是
-L:對象存在且是連接文件,則爲是
-r:對象存在且有可讀權限,則爲是
-w:對象存在且有可寫權限,則爲是
-x:對象存在且有執行權限,則爲是
-s:對象存在且不是空文件,則爲是
!:對測試條件的否定
邏輯關係:
-a:邏輯與,優先級大於邏輯或
-o:邏輯或,優先級最小
!:邏輯非,優先級最高
常用的執行腳本命令:
# bash [options] 腳本名
-x 查看腳本執行的詳細信息;常用
單條件判斷:if
if語句一般使用在判斷性執行環境中,語句格式爲:
如果條件是正確的,就執行命令;否則執行其他,退出
單分支if語句:簡單的if語句,如果條件判斷正確則執行,否則什麼也不做;此時只能判斷單一的一個正確條件,腳本功能比較單一,不能完成複雜任務
if 判斷條件; then
statement
fi
雙分支if語句:如果條件判斷正確,則執行一,否則執行二,然後退出;此時只能對一個條件進行判斷執行,功能比較單一
if 判斷條件; then
statement1
else
statement2
fi
多分支if語句:如果條件一判斷正確則執行一,否則判斷條件二,正確執行二,以此類推,如果條件都不正確,則執行最後一個,然後退出;此時腳本功能比較完善,能夠應對諸多可能發生的情況,可以完成比較複雜的任務
if 判斷條件一; then
stament1
elif 判斷條件二; then
stament2
elif 判斷條件三; then
stament3
...........
else
stament*
fi
實例:一、如果文件test爲空,則輸入內容this is test file
# touch test
# vim te.sh
#!/bin/bash
#
HANG=`wc -c test | cut -d' ' -f1`
if [ $HANG -eq 0 ]; then
echo this is test file > test
fi
執行並查看結果:
此時腳本只能在文件test存在時才能判斷,且只能對test爲空文件時做出動作
二、判斷文件test是否存在,如果不存在,就創建並輸入內容;否則輸出文件已存在
#!/bin/bash
#
CUNZAI=`ls test &> /dev/null`
ZHUANGT=`echo $?`
if [ $ZHUANGT -eq 0 ]; then
echo "file exise"
else
touch test
echo "this is test file" > test
fi
執行並查看結果
此時腳本執行之後會先判斷文件test是否存在,如果存在則輸出已經存在,如果不存在則先創建此文件,然後再輸入內容;此時的腳本已經初步具備判斷能力
三、判斷腳本後邊跟的參數,如果爲-s則顯示指定類型的用戶,如果爲-h則顯示腳本用法,否則顯示未知參數
#!/bin/bash
#
if [ $1 == '-d' ]; then
Userdel -r $2
elif [ $1 == '-D' ];then
Userdel -r $2
Elif [ $1 == ‘-a’ ]; then
Useradd $2
`Echo “$2” | passwd --stdin $2 &> /dev/null`
Elif [ $1 == ‘-A’ ]; then
Useradd $2
`Echo $2 | passwd --stdin $2`
else
Echo “unknow choice”
exit 8
fi
此腳本執行時判斷如果第一個參數爲-d,則刪除給出的用戶;如果是-D,則刪除給出的用戶;如果是-a、-A選項,則創建新用戶$2,並將新創建用戶的密碼更改爲自己的用戶名;如果都不是,就告訴用戶錯誤選項,並退出;此時腳本可以匹配多個選項並對應做出不同的動作,此時腳本已經可以滿足基本的需求
簡單循環體:for
For 語句一般使用在簡單的循環環境中,需要給出明確的循環體,語法格式爲:
For 變量 in 列表;do
要做的動作
Done
腳本執行之後,變量會在列表中取值並做出動作,然後依次遍歷列表,遍歷列表之後自動退出;而列表的生成有不同的方法,如
數字的列表可以直接使用數字表示即可:{1..100} 從一到一百,也可以使用命令`seq 100`,或者1 1 100,定義開始數字,每次加多少,結束數字;
命令的列表:直接將命令結果引用即可,反引號;
計算50以內4的倍數的和;此時如果使用if語句則非常麻煩,極易出錯,而是用for循環即可解決此問題;先考慮生成列表,4的倍數就是能被4整除的數,也可理解爲兩者之差是4的數,所以這個列表可以寫成:`seq 0 4 50`,執行腳本可以寫爲:
#!/bin/bash
#
declare-i I=0。。。。。。。。。。。。。。。。。。。declare聲明變量
declare -i SUM=0
for I in `seq 0 4 50`; do
let SUM=$[$SUM+$I]。。。。。。。。。。Let計算
done
echo “this sum is $SUM”
此時的執行結果會算出50以內4倍數的和,並將其輸出到屏幕上;
另一種使用for循環語句的語法:
#!/bin/bash
#
declare -i SUM=0
for ((I=1;I<=100;I++))
do
let SUM=$[$SUM+$I]
done
多條件判斷:case
與if判斷相似,同樣需要手工輸入判斷條件,只是條件可以更多;case常用語法是:
case 變量 in
條件一)
命令一
;;
條件二)
命令二
;;
.....
esac
此時如果變量滿足條件一,則執行一,以雙分號結束;滿足條件二,則執行命令二,以此類推;到esac則腳本結束
#!/bin/bash
#
case $1 in
-a|--add)
useradd $2
echo $2 | passwd --stdin $2
;;
-d|--del)
userdel $2
;;
-h|--help)
echo “Userage: -a|--add -d|--del -h|--help”
;;
*)
echo “Userage: -a|--add -d|--del -h|--help”
exit 2
;;
esac
正條件循環:while
while循環需要一定的進入條件,並不是直接進入循環,開始條件是:“如果命令執行狀態爲正確,則開始進入循環體,否則退出”;如
#!/bin/bash
#
declare -i SUM=0
read -p “qing shu ru yi ge shu: ” SR
while [ $SR -le 100 ]; do
let SUM+=$SR
let SR++
done
echo “this sum is $SUM”
非條件循環:until
until循環同樣需要一定的進入條件,開始條件和while剛好相反:“如果命令執行狀態爲錯誤,則開始進入循環體,否則退出”;如
#!/bin/bash
#
declare -i SUM=0
read -p “qing shu ru yi ge shu: ” SR
until [ $SR -gt 100 ]; do
let SUM+=$SR
let SR++
done
echo “this sum is $SUM”
Shell腳本學習尚淺,以後會有更多更新