Shell腳本:一個由一堆命令堆砌而成的,用來完成特定任務的,可以被指定解釋器執行的,文本文件。
這個是我對Shell腳本的理解。
1、Shell腳本就是一個可執行文本文件,它不需要編譯,不需要連接,寫完就可以直接執行;
2、Shell腳本的主體是一堆命令,每一條語句都可以再控制檯下直接執行;
3、指定解釋器,這個就是每個Shell腳本的第一句話,是固定的,解釋器有多個,Bash、CShell等等,所以需要指定下。
程序=最簡單的結構+語句+實現的思想。
最簡單的結構就相當於人的骨架,就是最簡單的一個程序,可以堪稱所有程序的祖宗的就是它。
語句就相當於人的血肉,用來填充這個骨架。在我看來就四種:輸入、輸出、循環、判斷。
實現思想就相當於人的靈魂,需要實現的功能都在此體現。
最簡單的結構,那就是最簡單的程序
#!/bin/bash
exit 0
這個Shell什麼也沒有做,就退出了,但它確實是最簡單的Shell腳本,他是符合語法規則的。
第一行指定了這個腳本是由bash來解釋執行的。
第二行退出當前腳本。
Shell的執行有兩種方式:
一個是./腳本名.sh 的方式執行,這種執行方式是新開一個bash來執行該腳本,類似與子進程的方式執行,所以腳本中的任何變量在腳本退出後都會被銷燬,不會在父進程中留下任何痕跡。
一個是source 腳本名.sh方式執行,這種方式,不再開子進程執行,腳本中的所有變量都會影響到當前的bash,即腳本執行完成後,在當前命令行可以查看腳本中的變量(如果腳本沒有取消(unset)變量的話)
語句
輸入:
Shell腳本的輸入和C語言的輸入一樣,一個是從外部讀取的,一個是命令本身的。
從外部讀取的,就是用read命令從用戶的輸入讀取的數據,與C語言的scanf類似。
#!/bin/bash
read -p "please enter a number:" iInputNum
exit 0
這個程序就是提示用戶輸入一個數字,然後讀取用戶的輸入。
這裏有輸入,自然要存儲,所以要定義變量來存儲。Shell腳本的變量定義算是我見過的最隨意的了。沒有類型,隨時定義,隨時使用。
隨便寫個字符串,他就是一個變量,可以是一個數字,可以是一個字符串,也可以是一個命令的執行結果,都行。
命令本身的輸入,就是指在執行的命令後面帶參數,類似與C語言的 int argc和char *argv。Shell腳本提供同樣的功能,這個是Shell腳本的默認變量
$0:代表命令本身
$1:代表命令後的第一個參數
$2:代表命令後的第二個參數
依次類推。
$#:代表參數的個數,不包括命令本身。
$@:表示輸出所有的參數,不包括命令本身。
輸出
輸出也不需要控制輸出格式什麼的,只有一個命令:echo。
#!/bin/bash
echo "Hello world"
exit 0
這個程序輸出一個最經典的一句話:“Hello world”。
這個是輸出字符串,如果要輸出變量,可以用下面的方式
echo $VarName
以美元符號($)加變量名的方式輸出一個變量。
循環
循環分爲三種:while循環、until循環、for循環
while循環格式:
while [判斷式]
do
#程序段
done
當滿足判斷式的時候,就進入循環,循環的主體就是中間的程序段,以do開始,以done結束。
until循環格式:
until [判斷式]
do
#程序段
done
如果判斷式成立,則停止循環。其餘與while循環類似。
for循環
for循環共有三種格式
1、適用於有限個,無規則的循環值
for 變量名 in 枚舉值1 枚舉值2 枚舉值3
do
#程序段
done
1、變量名,不需要加美元符
2、可以枚舉多個值,也可以式一個枚舉值包含多個數據,如“ls ”羅列出來的文件名,保存在同一個變量中,然後循環遍歷,此時只要寫一個變量名即可
2、適用於依次增加,且每次增加值爲1的情況
for 變量名 in $(seq 起始值 終止值)
do
#程序段
done
seq是sequence的縮寫,有連續之意,所以程序會從起始值開始逐次加一
3、適用於有一定增加規律,每次增加的值相同,但是不等於一的情況
for ((初始值; 限制值; 執行步長))
do
#程序段
done
從初始值開始每次增加步長,直至限制值
判斷
判斷實際上常用的只有一個if,但是有多種寫法
1、單個分支
if [條件判斷]; then
#處理
fi
2、兩個分支
if [條件判斷]; then
#處理
else
#處理
fi
3、多個分支
if [條件判斷]; then
#處理
elif [條件判斷]; then
#處理
else
#處理
fi
到此爲止,Shell腳本的基本結構已經都知道了,理論上已經可以寫出任何的Shell腳本了!
骨架、血肉都已經齊活了,接下來只需要將對問題的解決方法用這些語句表達出來就行了。
一開始就說過,Shell腳本就是一堆命令的堆砌,在知曉語法邏輯結構後,接下來就是看個人的命令使用的熟練程度了,這就要看個人修煉了。