shell script簡介 shell是解釋型語言,就是解釋器會一條一條的翻譯每一條語句並執行,對比之下,C語言是編譯型語言,編譯器把整個工程編譯成可執行文件才能執行 在沒有續行符( )的情況下,shell腳本的一條語句以"回車"為結束 任何一個shell腳本程式都必須在開頭用 標識使用的shel ...
shell script簡介
- shell是解釋型語言,就是解釋器會一條一條的翻譯每一條語句並執行,對比之下,C語言是編譯型語言,編譯器把整個工程編譯成可執行文件才能執行
- 在沒有續行符(
\回車
)的情況下,shell腳本的一條語句以"回車"為結束 - 任何一個shell腳本程式都必須在開頭用
#!
標識使用的shell程式,如果用的是bash,那就是#!/bin/sh
- shell腳本一行中的
#
之後的部分為註釋
- 剛剛寫完的一個shell script程式通常是沒有執行許可權的,需要手動$chmod +x filename.sh來添加可執行許可權
寫shell script的好習慣
- 用".sh"來表示一個shell 腳本文件
- 在文件的開頭依次標記:
# script 的功能;
# script 的版本信息;
# script 的作者聯繫方式;
# script 的版權;
# script 的歷史記錄;
# script 內較特殊的指令要使用絕對路徑;
# script 運作時需要的環境發量聲明;
內嵌變數
- shell script將執行的命令放在存儲在$0,命令之後的參數依次存儲在$1,$2...,利用這些變數,就可以編寫帶參數的腳本
- 定義函數的參數列表也使用$0, $1, $2 etc, 註意與命令行的參數相區分
- shell script還內嵌了一些特殊變數方便我們編程
- $# 代表命令後接的參數"個數"
- $@ 代表命令後接的每一個參數字元串,類似"$1", "$2", "$3".
- $* 代表命令後接的參數的集合字元串,類似"$1c$2c$3", c為分隔符,預設為空格鍵
自定義變數
- shell腳本的變數在使用前不需要"聲明",什麼時候用,就什麼時候定義
- shell腳本的變數也不區分整型、浮點型etc,所有的變數在解釋器看來都是字元串
- shell腳本的字元串可以使用
" "
也可以使用' '
- 有Python經驗的程式員可能會在運算符的前後大量的使用[空格]來使程式更加整齊,但是shell里不能這樣,因為解釋器會把[空格]也看做變數名的一部分,導致程式出錯
- shell用
$
來取一個變數的值,如果有歧義,可以使用{}
來對變數進行標識
var="Hello Shell"
cur_ver=1.1
echo $var
echo $variable #解釋器會去尋找**variable**這個變數,但這個變數是不存在的,沒有值
echo ${var}iable
echo $cur_ver
輸出的結果:
hello shell
hello shelliable
1.1
條件-if-then-fi
if的條件部分經常使用test EXPRESSION
或[ EXPRESSION ]
實現
if 條件1;then
執行語句1
elif 條件2;then
執行語句2
else
執行語句3
fi #條件結束標識,即將if反過來
舉個慄子
#!/bin/sh
var="a test string"
if [ '$var'='a test string' ];then #重要的事情:[ ]里的表達式兩邊各有一個空格
echo 'We find $var'
else
echo 'We do not know the value of $var'
fi
輸出結果:
$ ./shell_if.sh
We find $var
條件-case-esac
case適合處理多個分支的情況
case $var in
模式1)
執行語句1
;;
模式2)
執行語句2
;;
*) #其他情況
執行語句3
esac #就是case反過來
舉個慄子:
#!/bin/sh
var=4
case $var in
[a-z]|[A-Z])
echo "This is a letter"
;;
[0-9])
echo "This a number"
;;
*)
echo "This is neither a letter nor a number"
esac
執行結果:
$ ./Shell_case.sh
This a number
迴圈-while-do-done
條件滿足就執行迴圈體
while 條件
do
迴圈體
done
迴圈-until-do-done
不斷執行迴圈體直到條件得到滿足
until 條件
do
迴圈體
done
迴圈-for-do-done
每次迴圈var都取一個cand的值並執行迴圈體
for var in cand1 cand2 cand3...
do
迴圈體
done
shell script也接受類C的for迴圈寫法
for ((i=0;i<6;i++)){
迴圈體
}
shell script函數
和其他語言一樣,shell腳本的函數也是對功能代碼塊的封裝
#定義一個函數
fcn_name (){
程式段
}
使用函數的時候只要直接使用函數名即可