之前在寫shell指令碼時,每次除錯指令碼非常麻煩。
過程如下 寫指令碼—執行指令碼—指令碼語法有問題----找到報錯的行----修改後繼續執行指令碼----指令碼中部分**報錯還能繼續執行----再次除錯指令碼—直到指令碼正常執行。
下面介紹幾個實用的小技巧
1、不加nounset
[root@lineqi ~]# cat testjs.sh
#!/bin/bash
bb=「cccc」
echo $aa
echo $bb
[root@lineqi ~]# ./testjs.sh
cccc
不加nounset引數時,遇到不存在的變數,預設情況下會忽略,直接執行下行語句。
2、加nounset
#!/bin/bash
set -o nounset
bb=「cccc」
echo $aa
echo $bb
[root@lineqi ~]# ./testjs.sh
./testjs.sh: line 4: aa: unbound variable
不加nounset引數時,遇到不存在的變數,會提示錯誤資訊,不會執行下行語句。
在預設情況下,遇到shell指令碼遇到執行錯誤時,會跳過並繼續執行後命令,這時可以通過errexit來避免。
[root@lineqi ~]# /opt/install_mysql57_v1.5.sh
執行指令碼前,檢查語法錯誤
[root@lineqi ~]# bash -n /opt/install_mysql57_v1.5.sh
/opt/install_mysql57_v1.5.sh: line 19: syntax error near unexpected tokenfi' /opt/install_mysql57_v1.5.sh: line 19:
fi』
在指令碼前set -o verbose加上引數,執行過程如下
[root@lineqi ~]# /opt/install_mysql57_v1.5.sh
v_mysql_data=/mysql/data
v_mysql_log=/mysql/log
v_software_dir=/opt
v_tar_name=/opt/mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar.tar
#check mariadb is installed
is_mariadb_install=rpm -qa|grep mariadb|wc -l
rpm -qa|grep mariadb|wc -l
if [ $is_mariadb_install -ge 0 ] ;
echo 『aa』
for i inrpm -qa |grep mariadb
dorpm -e --nodeps $i
done
fi/opt/install_mysql57_v1.5.sh: line 18: syntax error near unexpected tokenfi' /opt/install_mysql57_v1.5.sh: line 18:
fi』
說明:與bash -v輸出的結果基本一致,少了指令碼注釋和set部分
[root@lineqi ~]# /opt/install_mysql57_v1.5.sh
跟蹤指令碼裡每乙個命令的執行過程,並附加擴充資訊
[root@lineqi ~]# bash -x /opt/install_mysql57_v1.5.sh
跟蹤指令碼裡每乙個命令的執行過程,並顯示錯誤資訊的行號
[root@lineqi ~]# bash -v /opt/install_mysql57_v1.5.sh
#!/bin/bash
#function :install mysql5.7 on centos7.4
#author:lineqi
#create time:2019-01-01
set -o nounset
set -o errexit
v_mysql_data=/mysql/data
v_mysql_log=/mysql/log
v_software_dir=/opt
v_tar_name=/opt/mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar.tar
#check mariadb is installed
is_mariadb_install=rpm -qa|grep mariadb|wc -l
rpm -qa|grep mariadb|wc -l
if [ $is_mariadb_install -ge 0 ] ;
echo 『aa』
for i inrpm -qa |grep mariadb
dorpm -e --nodeps $i
done
fi/opt/install_mysql57_v1.5.sh: line 19: syntax error near unexpected token `fi』
注意:-v引數顯示已執行的指令碼內容包括注釋
總結:在除錯shell指令碼時,以上幾個引數還是非常有用的。
LInux shell入門 除錯
shell的除錯 sh option bash option echo 輸出內容 list color red e 如果乙個命令失敗就立即退出 color shell執行時,若遇到不存在或不可執行的命令 重定向失敗或命令非正常結束等情況時,如果未經重新定向,該出錯資訊會顯示在終端螢幕上,而shell...
Linux Shell 程式除錯
linux shell程式除錯 shell程式的除錯是通過執行程式時加入相關除錯選項或在指令碼程式中加入相關語句,讓shell程式在執行過程中顯示出一些可供參考的 除錯資訊 當然,使用者也可以在shell程式中的適當位置加入一些echo命令用於除錯與跟蹤。方法一 在執行指令碼程式時加入除錯選項 用法...
Linux Shell指令碼基礎
shell指令碼在處理自動迴圈或大的任務方面可節省大量時間,且功能強大。任何指令碼都可能有注釋,加注釋需要此行的第乙個字元為 直譯器對此行不予解釋。指令碼不是複雜的程式,它是按行解釋的。指令碼第一行總是以 bin sh開始,這段指令碼通知shell使用系統上的 bourne shell直譯器。指令碼...