二、陣列
三、迴圈
until 迴圈
四、shell正規表示式和萬用字元
五、shell指令碼內建變數
六、總結一些用到的小技巧
七、shell程式設計常用注意事項
str1 = str2 當兩個串有相同內容,長度時為真
str1 == str2 當兩個串有相同內容,長度時為真
str1 != str2 當串str1和str2不等時為真
-n 真(串非空)
-z str1 當串的長度為0時為真(空串)
str1 當串str1為非空時為真
-eq 兩數相等為真
-ne 兩數不等為真
-gt init1大於init2為真
-ge init1大於等於init2為真
-lt init1小於int2為真
-le int1小於等於int2為真
-a 與
-o 或
! 非
-s 檔案大小非0時為真
-f 檔案為正規檔案為真
-a 如果file存在則為真
-d 如果file存在且是乙個目錄則返回真
-e 指定的檔案或者目錄存在時返回為真
((i=$j+$k)) 等價於 i=`expr $j + $k` 等價於 let i="j+k"
((i=$j-$k)) 等價於 i=`expr $j - $k` 等價於 let i="j-k"
((i=$j\*$k)) 等價於 i=`expr $j \* $k` 等價於 let i="j*k"
((i=$j/$k)) 等價於 i=`expr $j / $k` 等價於 let i="j/ k"
基本概念
shell的if語法和c語言等高階語言非常相似,唯一需要注意的地方就是shell的if語句對空格方面的要求比較嚴格(其實shell對所有語法的空格使用都比較嚴格),如果在需要空格的地方沒有打上空格,都會報錯。
例如:如if [ $1x == "ip"x ];then echo 「abc」;fi中少乙個空格都會報錯。另外shell的if語句必須以fi作為結尾,不然同樣會報錯
有else和elif時也一樣,需要注意空格的問題,下面這個例子可以作為參考
if [ $1x == "ab"x ]; then
echo "you had enter ab"
elif [ $1x == "cd"x ]; then
echo "you had enter cd"
else
echo "you had enter unexpected word"
fi
[和[[的區別
區別一。在[中使用邏輯運算子,需要使用-a(and)或者-o(or)。在[[中使用邏輯運算子,需要使用&&或者||。
區別二。[是shell命令,在它包圍的表示式是它的命令列引數,所以串比較符》和《需要轉義,否則就變成io重定向了。[[是shell關鍵字,不會做命令列擴充套件,所以《和》不需要進行轉義。但是語法相對嚴格,如在[中可以用引號括起操作付,[[則不行。如if [ 「-z」 「ab」 ]。
區別三。[[可以做算術擴充套件,[則不行。如if [[ 11+1 -eq 100 ]],而if [ 11+1 -eq 100 ]則會報錯。
1、for (( m=0;m<$;m++ ))
2、for((m=0;m<$;m++)) do echo $; done
3、for i in $
4、字典遍歷
for key in $(echo $);do echo "$key : $";done
//osd_array_tmp為一行有明確分隔符的字串,可以直接轉化為陣列
osd_array_tmp=`filter_out_no_used_osds`
osd_array=(`echo $osd_array_tmp | awk '}'`)
echo $
echo $
死迴圈應用
while [ 1 ] 相當於 while :
* : 0個或多個在*字元之前的那個普通字元
. : 匹配任意字元
^ : 匹配行首,或者取反,當放在裡面時表示取反
$ : 匹配行尾 micky$表示匹配以 micky結尾的所有行
: 匹配字元集合 [a-z][a-z][0-9]分別表示匹配小寫字母,大寫字母,數字
\ : 轉義字元
\<\> : 精確匹配符號 記得加雙引號
\ : 匹配前面的字元出現n次
\: 匹配前面的字元至少出現n次
\: 匹配前面的字元出現n-m次
擴充套件正規表示式可用
? : 匹配0個或1個在其之前的那個普通字元
+ : 匹配1個或多個在其之前的那個普通字元
() : 表示乙個字元集合或用在expr中 例如:ceph-(a|b|c)匹配ceph-a\ceph-b\ceph-c
| : 匹配一組可選字元
字元 含義 例項
* 匹配 0 或多個字元 a*b a與b之間可以有任意長度的任意字元, 也可以乙個也沒有, 如aabcb, axyzb, a012b, ab。
? 匹配任意乙個字元 a?b a與b之間必須也只能有乙個字元, 可以是任意字元, 如aab, abb, acb, a0b。
[list] 匹配 list 中的任意單一字元 a[xyz]b a與b之間必須也只能有乙個字元, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。
[!list] 匹配 除list 中的任意單一字元 a[!0-9]b a與b之間必須也只能有乙個字元, 但不能是阿拉伯數字, 如axb, aab, a-b。
[c1-c2] 匹配 c1-c2 中的任意單一字元 如:[0-9] [a-z] a[0-9]b 0與9之間必須也只能有乙個字元 如a0b, a1b... a9b。
匹配 sring1 或 string2 (或更多)其一字串 ab a與b之間只能是abc或xyz或123這三個字串之一。
[[:alpha:]] 任何字母
[[:digit:]] 任何數字
[[:alnum:]] 任何字母和數字
[[:space:]] 任何空白字元
[[:upper:]] 任何大寫字母
[[:lower:]] 任何小寫字母
[[:punct:]] 任何標點符號
[[:xdigit:]] 任何16進製制的數字,相當於[0-9a-fa-f]
echo $lineno
echo $funcname
echo $bash_lineno
echo $random 表示隨機數
$@:表示傳入引數的所有內容
$*:表示傳入引數的所有內容
$#:表示給函式傳入引數的個數
$$:當前程序的id
print each param from "$*"
a b c d
print each param from "$@"ab
cd
shell 中if支援正規表示式,需要用兩個中括號括起來
if [[ $myname =~ "wangdan"[1][2,3,4,5,6] ]];then
echo "hello world"
fi
a=$(date +%h%m%s)
if [ $1 == 「ab" ] 寫為 if [ $1x == 「ab"x ]
可以使用該方法,執行遠端節點命令(注意第二個eof要頂格,前後不能有空格)
ssh user@$host 《給函式內部的變數定義時,前面加上local,則外部的變數可以延續到函式中來,但是內部的變數不會影響到之前定義的外部變數。
[ $? -ne 0 ] && /usr/bin/logger -i "ceph-pool:[me] line:$lineno exec ceph osd create create-erasure rule failed,errorcode : $?" && exit 1
Shell程式設計 shell特性
linux會預設記錄1000條歷史記錄,可通過 echo histsize 檢視,如果講histsize更改為2000,那麼會預設儲存2000條。1000條記錄儲存在家目錄的 bash history 中,僅當使用者正常退出當前shell時,當前shell中執行的命令才會儲存到 bash histo...
Shell程式設計 Shell函式
shell函式 1.將命令序列按格寫在一起 2.可方便重複使用命令序列 3.shell函式定義 function 函式名 4.呼叫函式的方法 函式名 引數1 引數2 5.shell函式應用示例 1 兩個數字求和 要求 通過sum 定義函式 兩個數求和 方法一 root localhost vim d...
Shell程式設計
1 建立指令碼 vi emacs等即可 bin sh 2 shell變數 對shell來講,所有的變數的取值都是乙個字串 shell是一種解釋性語言,變數無需事先定義 shell中的系統變數 程式命令列引數的數目 儲存前乙個命令的返回值 0 當前程式名 以 1 2 形式儲存所有輸入的命令列引數 以 ...