開啓shell環境
Mac系統下,自帶的終端就是一個標準的shell環境,筆者這裏沒有使用自帶的終端,而是自己安裝了iTerm2,這也是一個標準的shell環境。
創建shell腳本的路徑
mkdir -p shell/script
創建shell腳本
1)shell腳本的格式是.sh的文件,使用vim編輯器創建腳本。
vim first_shell.sh
2)編輯shell腳本內容
#!/bin/bash
#This is a shell script
echo "hello world!"
腳本中的第一行#!/bin/bash
的作用是提示這一文件是shell腳本文件;
第二行是註釋行,shell腳本中用#來進行註釋;
接下來就是shell命令行,這是shell腳本中真正執行的語句;
腳本編輯完成後,保存退出。
shell腳本的執行
執行shell腳本有以下兩種方法:
1)直接使用命令/bin/bash
或bash
切換到shell執行環境,然後執行.sh文件
/bin/bash first_shell.sh
2)給.sh文件添加執行權限
首先使用ls -l
查看文件權限
可以看到當前文件是沒有執行權限,使用命令chmod
來修改文件的權限,這裏修改爲當前用戶有執行權限
chmod u+x first_shell.sh
然後,使用以下命令執行
./first_shell.sh
shell腳本的調試
- bash -n first_shell.sh
-n選項可用於測試shell腳本是否存在語法錯誤,不會實際執行命令。養成完成shell腳本後使用-n選項來測試腳本是否存在語法錯誤是一個很好的工作習慣。 - bash -c “string”
-c選項可以使shell解釋器從一個字符串而不是文件中讀取並執行shell命令。該選項對於需要臨時測試一小段腳本的執行結果時很有用,示例如下:
- bash -x first_shell.sh
-x選項用來跟蹤腳本的執行,是調試shell腳本的工具,-x選項是shell在執行腳本的過程中,顯示實際的每一行信息,且在行首顯示一個’+‘號,’+'號後面顯示的是經過變量替換之後的命令行的內容,有助於分析命令的執行過程,示例如下:
shell腳本內容:
#!/bin/bash
#define funciton
function add ()
{
if (( $# < 2 ));then
echo "please input two numbers!"
exit
fi
return $(($1 + $2))
}
add $1 $2
echo "Sum is $? "
調試過程:
1)未輸入參數的情況
2)正確輸入參數的情況
對“-x”選項的增強
觀察上面使用-x選項來對shell腳本調試的輸出結果,調試的輸出信息是進行變量替換之後的命令行內容以及在行首的’+'號提示符,對於行數比較多的複雜腳本來說,還是很難在shell腳本中定位到具體的有問題的行,可以使用shell的內置環境變量來增強“-x”選項的輸出信息,比如行號、函數名等。
內置環境變量$LINENO可以表示shell腳本的當前行號;
內置環境變量$FUNCNAME表示函數的名字,這個變量是一個數組變量,包含了整個調用鏈上所有的函數名,${FUNCNAME[0]}表示當前正在執行的函數的名稱,${FUNCNAME[1]}表示調用函數${FUNCNAME[0]}的函數名稱,以此類推。。
在shell PS變量中也介紹過,PS4變量是跟蹤執行輸出的前綴,默認爲‘+’,而bash -x 調試信息中的“+”號正是$PS4的值,因此可以通過重定義PS4的值來增強-x選項的輸出。
可以在執行調試命令前,先執行export PS4=’+{{FUNCNAME[0]}}’,臨時將PS4變量設置成+{行號}:{當前函數名稱}的形式,也可以將PS4的設置信息寫入.bash_profile文件中,運行source .bash_profile讓其生效,使PS4的設置永久生效,新的調試信息如下:
輸入參數的情況:
當然,也可以使用其他的內置環境變量來重定義PS4變量,目的是提高調試信息的可讀性。