## Bash腳本調試
Bash程序調試有多種方式:
* 方法1:通過命令打印信息到標準輸出或追加到文件中
* 方法2:Bash自帶參數
* 方法3:set命令
## 方法1
我們可以通過echo和prinf命令將信息打印到標準輸出或文件中。
```
#!/bin/bash
name=$1
pass=$2
echo $name # 打印名字
echo $pass
if [ "$name" == "djangowang" -a "${pass}" == "123456" ];then
echo "login succ"
fi
```
## 方法2
通過Bash自帶參數:
* -x 跟蹤模式\(xtrace\)。可以跟蹤各種語法的調用,并打印出每個命令的輸出結果
* -n 檢測腳本是否有語法錯誤
* -v 可視模式,它會在執行bash程序的時候將要執行的內容也打印出來,除此之外并不改變bash執行的過程:
見以下test.sh
```
#!/bin/bash
name=$1
pass=$2
if [ "$name" == "djangowang" -a "${pass}" == "123456" ];then
echo "login succ"
fi
```
-v 執行結果。
```
[root@blog.puppeter.com_centos ~]# sh -v test.sh djangowang 123456
#!/bin/bash
name=$1
pass=$2
if [ "$name" == "djangowang" -a "${pass}" == "123456" ];then
echo "login succ"
fi
login succ
```
-x 執行結果。
```
[root@blog.puppeter.com_centos ~]# sh -x test.sh djangowang 123456
+ name=djangowang
+ pass=123456
+ '[' djangowang == djangowang -a 123456 == 123456 ']'
+ echo 'login succ'
login succ
```
## 方法3
set是Bash的內建命令,經常用于程序的調試。注以下案例部分參考了[http://www.ruanyifeng.com/blog/2017/11/bash-set.html?utm\_source=tool.lu。](http://www.ruanyifeng.com/blog/2017/11/bash-set.html?utm_source=tool.lu。)
我們來看一下-x和+x的用法,以下是打印1-5的數字,其中-x用于打開調試,+x用于關閉調試。在程序執行過程中會看到打印到3,4時前面會有+號打印出調試信息。
```
#!/bin/bash
echo "1"
echo "2"
set -x
echo "3"
echo "4"
set +x
echo "5"
```
set -u的用法。 以下程序會在屏幕上打印出bar,其中變量$a是一個不存在的變量默認不會打出。
```
#!/bin/bash
echo $a
echo bar
```
我們對程序稍做修改,增加set -u會發現當遇到不存在的變量時程序會報錯(1.sh: line 4: a: unbound variable)。
```
#!/bin/bash
set -u
echo $a
echo bar
```
set -e的用法。以下案例foo是一個不存在的命令,執行時會報錯\(1.sh: line 2: foo: command not found\)但是Bash會忽略這個錯誤繼續往下執行。
```
#!/bin./bash
foo
echo bar
```
-e 的作用就是腳本出現了問題就立馬終止執行。
```
#!/bin./bash
set -e
foo
echo bar
```
- Introduction
- 1.Shell編程基礎
- 什么是Shell
- 編寫第一個Bash程序
- 2.變量
- 什么是變量
- 變量四種賦值方式
- 指定變量類型
- 變量的類型
- 特殊變量
- 3.Bash符號相關
- Bash符號相關
- 特殊符號
- 數學運算符號
- 4.內建命令與外部命令
- 內建命令與外部命令
- 5.read命令
- read命令
- 6.條件語句
- if..then..fi
- if..then..else..fi
- if..then..elif..fi
- 空命令
- 文件測試符
- 字符串判斷、與、或和非
- []與[[]]符號
- 7.Bash循環 && 分支語句
- while循環語句
- for循環
- for..in循環
- until循環
- select循環
- case分支語句
- 8.正則表達式
- 正則表達式
- 9.子Shell和受限Shell
- 子Shell
- 受限Shell
- 10.函數與函數的加載
- 函數語法與案例
- 遞歸函數
- 函數的加載
- 11.Bash腳本風格
- Bash腳本風格
- 12.Bash腳本調試
- Bash腳本調試
- 13.sed && awk
- sed
- 14.awk
- awk
- 15 Bash雜項 && 案例
- while循環的陷阱
- Bash的生命周期
- IO重定向
- /bin/bash和/bin/sh區別
- 命令雜項
- Shell加密
- 16.10.2.案例
- Bash版回收站
- 17.Bash中文速查表
- 中文速查表