linux-shell指令碼知識點
註釋
符號#!用來告訴系統它後面的引數是用來執行該檔案的程式。在這個例子中我們使用/bin/sh來執行程式。(可以執行echo $SHELL來看你的系統是使用那一類shell, 比如ubuntu使用的是/bin/bash,則第一行寫成#!/bin/bash)
當編輯好指令碼時,如果要執行該指令碼,還必須使其可執行。 要使指令碼可執行: 編譯 chmod +x filename 這樣才能用./filename 來執行 .
美元符號的用法
運算子 | 解釋 |
---|---|
$0 | shell的命令本身(包括完整路徑) |
數字表示shell 的第幾個引數 | |
$# | 傳遞到指令碼的引數個數 |
$* | 以一個單字串顯示所有向指令碼傳遞的引數 |
$! | 後臺執行的最後一個程序的ID號 |
$- | 顯示shell使用的當前選項。 |
$? | 顯示最後命令的執行狀況。0表示沒有錯誤。 |
$$ | 指令碼執行的ID號 |
變數
在shell程式設計中,所有的變數都由字串組成,並且不需要對變數進行宣告,例如:
``` temp="abc" #注意=前後不能有空格,否則變數值會被認為是一個命令 echo $temp; #變數在賦值時不需要加$符號,但是在呼叫時,需要加$符號。 echo {$temp}qwe;#當變數名與符號串連線在一起時,為了使其不被混淆,需要在變數周圍加一對大括號。 ```
管道,重定向和反短斜線
管道 (|) 將一個命令的輸出作為另外一個命令的輸入.
例如:
```
find -name"temp" |wc -l#即將find命令的輸出作為wc命令輸入,來統計當前目錄下檔名包含temp的檔案的個數
```
重定向:將命令的結果輸出到檔案,而不是標準輸出(螢幕)
1. >寫入檔案並覆蓋舊檔案
2. >> 加到檔案的尾部,保留舊檔案內容。
3. /dev/null 代表空裝置檔案
> 代表重定向到哪裡,例如:echo "123" > /home/ 123.txt
1 表示stdout標準輸出,系統預設值是1,所以">/dev/null"等同於"1>/dev/null"
2 表示stderr標準錯誤
& 表示等同於的意思,2>&1,表示2的輸出重定向等同於1
1>/dev/null 首先表示標準輸出重定向到空裝置檔案,也就是不輸出任何資訊到終端,說白了就是不顯示任何資訊。
2>&1 接著,標準錯誤輸出重定向等同於 標準輸出,因為之前標準輸出已經重定向到了空裝置檔案,所以標準錯誤輸出也重定向到空裝置檔案。
反短斜線:使用反短斜線( ` )可以將一個命令的輸出作為另外一個命令的一個命令列引數。
例如
ftype=`file "$1"` #將輸入的第一個引數的檔案資訊賦值給ftype變數
流程控制
if
語法為:if ....; then .... elif ....; then .... else .... fi
#!/bin/sh ftype=`file "$1"` case "$ftype" in "$1: Zip archive"*) unzip "$1" ;; "$1: gzip compressed"*) gunzip "$1" ;; "$1: bzip2 compressed"*) bunzip2 "$1" ;; *) echo "File $1 can not be uncompressed with smartzip";; esac
selsect
select var in ... ; do break done
#!/bin/sh echo "What is your favourite OS?" select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do break done echo "You have selected $var"
while
while ...; do .... done
i=1 while(test $i -lt 20) do echo $i done
for
for var in ....; do .... done
#!/bin/sh for var in A B C ; do echo "var is $var" done
引號
雙引號防止萬用字元擴充套件
單引號防止萬用字元和變數擴充套件
使用轉移字元也可以防止擴充套件
herdoc
comment string <<<
body
string;
注意
以
<<<
End開始標記開始,以End結束標記結束,結束標記必須頂頭寫,不能有縮排和空格,且在結束標記末尾要有分號。開始標記和開始標記相同,比如常用大寫的EOT、EOD、EOF來表示,但是不只限於那幾個,只要保證開始標記和結束標記不在正文出現即可。位於開始標記和結束標記之間的變數可以被正常解析,但是函式則不可以。
heredoc常用在輸出包含大量HTML語法d文件的時候。比如:函式outputhtml()要輸出HTML的主頁。可以有兩種寫法。很明顯第二種寫法比較簡單和易於閱讀。