Linux Shell指令碼學習 筆記整理__Linux

來源:互聯網
上載者:User
指定指令碼解譯器

#!/bin/bash


注意: 1、該聲明只能放在指令碼的首行,說明該指令碼使用bash解譯器來解釋執行,否則會被當成注釋 2、bash必須使用絕對路徑
3、該聲明只在指令碼作為可執行程式,通過./test.sh調用是才有效,如果通過sh test.sh 則會直接運行sh解譯器 test.sh只是作為參數傳遞而已
調試指令碼 通過參數-x來調試指令碼 

sh -x test.sh

這將執行該指令碼並顯示所有變數的值。 
shell還有一個不需要執行指令碼只是檢查文法的模式。可以這樣使用: 
sh -n test,sh

這將返回所有語法錯誤

shell變數
1、readonly設定唯讀變數
#!/bin/bashname="Jack"readonly namename="Jams"
readonly修飾後,name的值不能再改變,否則執行會報錯: name: readonly variable
2、 unset 刪除變數 相當於將變數置為空白,unset不可以刪除唯讀變數
3、變數類型 運行shell時,會同時存在三種變數:
1) 局部變數 局部變數在指令碼或命令中定義,僅在當前shell執行個體中有效,其他shell啟動的程式不能訪問局部變數。
2) 環境變數 所有的程式,包括shell啟動的程式,都能訪問環境變數,有些程式需要環境變數來保證其正常運行。必要的時候shell指令碼也可以定義環境變數。
3) shell變數 shell變數是由shell程式設定的特殊變數。shell變數中有一部分是環境變數,有一部分是局部變數,這些變數保證了shell的正常運行

4、特殊變數 $0 當前指令碼的檔案名稱
$n 傳遞給指令碼或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$# 傳遞給指令碼或函數的參數個數。
$* 傳遞給指令碼或函數的所有參數。
$@ 傳遞給指令碼或函數的所有參數。
$? 上個命令的退出狀態,或函數的傳回值。
$$ 當前Shell進程ID。對於 Shell 指令碼,就是這些指令碼所在的進程ID。


$* 和 $@ 都表示傳遞給函數或指令碼的所有參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。
但是當它們被雙引號(" ")包含時,
"$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;
"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數。


單引號與雙引號 單引號用於保持引號內 所有字元的字面值,即使引號內的\和斷行符號也不例外,但是字串中 不能再出現單引號。
雙引號用於保持引號內所有字元的字面值(斷行符號也不例外), 但以下情況除外:
$加變數名可以取變數的值
反引號仍表示命令替換
\$表示$的字面值
\`表示`的字面值
\"表示"的字面值
\\表示\的字面值
除以上情況之外,在其它字元前面的\無特殊含義,只表示字面值。

算數運算

下表列出了常用的算術運算子,假定變數 a 為 10,變數 b 為 20:

運算子 說明 舉例
+ 加法 `expr $a + $b` 結果為 30。
- 減法 `expr $a - $b` 結果為 -10。
* 乘法 `expr $a \* $b` 結果為  200。
/ 除法 `expr $b / $a` 結果為 2。
% 取餘 `expr $b % $a` 結果為 0。
= 賦值 a=$b 將把變數 b 的值賦給 a。

運算式和運算子之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數程式設計語言不一樣。
完整的運算式要被 ` ` 包含,注意這個字元不是常用的單引號,在 Esc 鍵下邊。
乘法符號需要轉義
除了expr,還可以用(())來表示,例如:var=$(( 20 + 5 ))

數位關係運算子

關係運算子只支援數字,不支援字串,除非字串的值是數字。

下表列出了常用的關係運算子,假定變數 a 為 10,變數 b 為 20:

運算子 說明 舉例
-eq 檢測兩個數是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 檢測兩個數是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 檢測左邊的數是否大於右邊的,如果是,則返回 true。 [ $a -gt $b ] 返回 false。
-lt 檢測左邊的數是否小於右邊的,如果是,則返回 true。 [ $a -lt $b ] 返回 true。
-ge 檢測左邊的數是否大於等於右邊的,如果是,則返回 true。 [ $a -ge $b ] 返回 false。
-le 檢測左邊的數是否小於等於右邊的,如果是,則返回 true。 [ $a -le $b ] 返回 true。


布爾/邏輯運算

下表列出了常用的布林運算子,假定變數 a 為 10,變數 b 為 20:

運算子 說明 舉例
! 非運算,運算式為 true 則返回 false,否則返回 true。 [ ! false ] 返回 true。
-o 或運算,有一個運算式為 true 則返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 與運算,兩個運算式都為 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

以下介紹 Shell 的邏輯運算子(注意用了雙中括弧),假定變數 a 為 10,變數 b 為 20:

運算子 說明 舉例
&& 邏輯的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 邏輯的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

字串運算子

下表列出了常用的字串運算子,假定變數 a 為 "abc",變數 b 為 "efg":

運算子 說明 舉例
= 檢測兩個字串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 檢測兩個字串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 檢測字串長度是否為0,為0返回 true。 [ -z $a ] 返回 false。
-n 檢測字串長度是否為0,不為0返回 true。 [ -n $a ] 返回 true。
str 檢測字串是否為空白,不為空白返回 true。 [ $a ] 返回 true。

字串比較的> < 要轉義,否則會被當作重新導向符號
字串處理
取長度
str="abcd"expr length $str   # 4echo ${#str}       # 4

尋找子串的位置
str="abc"expr index $str "a"  # 1expr index $str "b"  # 2expr index $str "x"  # 0expr index $str ""   # 0

截取子串
str="abcdef"expr substr "$str" 1 3  # 從第一個位置開始取3個字元, abcexpr substr "$str" 2 5  # 從第二個位置開始取5個字元, bcdef expr substr "$str" 4 5  # 從第四個位置開始取5個字元, defecho ${str:2}           # 從第二個位置開始提取字串, bcdefecho ${str:2:3}         # 從第二個位置開始提取3個字元, bcdecho ${str:(-6):5}        # 從倒數第二個位置向左提取字串, abcdeecho ${str:(-4):3}      # 從倒數第二個位置向左提取6個字元, cdestr="abbc,def,ghi,abcjkl"echo ${str#a*c}     # 輸出,def,ghi,abcjkl  一個井號(#) 表示從左邊截取掉最短的匹配 (這裡把abbc字串去掉)echo ${str##a*c}    # 輸出jkl,             兩個井號(##) 表示從左邊截取掉最長的匹配 (這裡把abbc,def,ghi,abc字串去掉)echo ${str#"a*c"}   # 輸出abbc,def,ghi,abcjkl 因為str中沒有"a*c"子串echo ${str##"a*c"}  # 輸出abbc,def,ghi,abcjkl 同理echo ${str#*a*c*}   # 空echo ${str##*a*c*}  # 空echo ${str#d*f)     # 輸出abbc,def,ghi,abcjkl, echo ${str#*d*f}    # 輸出,ghi,abcjkl    echo ${str%a*l}     # abbc,def,ghi  一個百分比符號(%)表示從右邊截取最短的匹配 echo ${str%%b*l}    # a             兩個百分比符號表示(%%)表示從右邊截取最長的匹配echo ${str%a*c}     # abbc,def,ghi,abcjkl

字串替換
str="apple, tree, apple tree"echo ${str/apple/APPLE}   # 替換第一次出現的appleecho ${str//apple/APPLE}  # 替換所有apple echo ${str/#apple/APPLE}  # 如果字串str以apple開頭,則用APPLE替換它echo ${str/%apple/APPLE}  # 如果字串str以apple結尾,則用APPLE替換它

大小寫轉換
##轉為大寫echo $PATH | tr '[a-z]' '[A-Z]'##轉為小寫echo $PATH | tr '[A-Z]' '[a-z]'

檔案測試運算子

檔案測試運算子用於檢測 Unix 檔案的各種屬性。

屬性檢測描述如下:

操作符 說明 舉例
-b file 檢測檔案是否是塊裝置檔案,如果是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測檔案是否是字元裝置檔案,如果是,則返回 true。 [ -c $file ] 返回 false。
-d file 檢測檔案是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案),如果是,則返回 true。 [ -f $file ] 返回 true。
-g file 檢測檔案是否設定了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
-k file 檢測檔案是否設定了粘著位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。
-p file 檢測檔案是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。
-u file 檢測檔案是否設定了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
-r file 檢測檔案是否可讀,如果是,則返回 true。</
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.