shell程式設計

2021-10-01 20:55:31 字數 4251 閱讀 5094

二、陣列

三、迴圈

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 形式儲存所有輸入的命令列引數 以 ...