第一個shell腳本編寫

開啓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/bashbash切換到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=’+{LINENO:LINENO:{FUNCNAME[0]}}’,臨時將PS4變量設置成+{行號}:{當前函數名稱}的形式,也可以將PS4的設置信息寫入.bash_profile文件中,運行source .bash_profile讓其生效,使PS4的設置永久生效,新的調試信息如下:
在這裏插入圖片描述
輸入參數的情況:
在這裏插入圖片描述
當然,也可以使用其他的內置環境變量來重定義PS4變量,目的是提高調試信息的可讀性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章