红联Linux门户
Linux协助

如安在Linux或许UNIX下调试Bash Shell脚本

发布时刻:2018-02-02 15:19:03来历:linux.cn作者:jon
我写了一个 hello world 小脚本。我怎么能调试运转在 Linux 或许类 UNIX 的体系上的 bash shell 脚本呢?
这是 Linux/Unix 体系办理员或新用户最常问的问题。shell 脚本调试或许是一项繁琐的作业(不容易阅览)。调试 shell 脚本有多种办法。
您需求传递 -x 或 -v 参数,以在 bash shell 中阅读每行代码。
如安在Linux或许UNIX下调试Bash Shell脚本
让咱们看看怎么运用各种办法调试 Linux 和 UNIX 上运转的脚本。
 
-x 选项来调试脚本
用 -x 选项来运转脚本:
$ bash -x script-name
$ bash -x domains.sh
 
运用 set 内置指令
bash shell 供给调试选项,能够翻开或封闭运用 set 指令:
set -x : 显现指令及其履行时的参数。
set -v : 显现 shell 输入行作为它们读取的
能够在 shell 脚本自身中运用上面的两个指令:
#!/bin/bash
clear
# turn on debug mode
set -x
for f in *
do
file $f
done
# turn OFF debug mode
set +x
ls
# more commands
你能够替代规范释伴行:
#!/bin/bash
用以下代码(用于调试):
#!/bin/bash -xv
 
运用智能调试功用
首要增加一个叫做 _DEBUG 的特别变量。当你需求调试脚本的时分,设置 _DEBUG 为 on:
_DEBUG="on"
在脚本的最初放置以下函数:
function DEBUG()
{
[ "$_DEBUG" == "on" ] &&  $@
}
现在,只需你需求调试,只需运用 DEBUG 函数如下:
DEBUG echo "File is $filename"
或许:
DEBUG set -x
Cmd1
Cmd2
DEBUG set +x
当调试完(在移动你的脚本到出产环境之前)设置 _DEBUG 为 off。不需求删去调试行。
_DEBUG="off" # 设置为非 'on' 的任何字符
示例脚本:
#!/bin/bash
_DEBUG="on"
function DEBUG()
{
[ "$_DEBUG" == "on" ] &&  $@
}
DEBUG echo 'Reading files'
for i in *
do
grep 'something' $i > /dev/null
[ $? -eq 0 ] && echo "Found in $i file"
done
DEBUG set -x
a=2
b=3
c=$(( $a + $b ))
DEBUG set +x
echo "$a + $b = $c"
保存并封闭文件。运转脚本如下:
$ ./script.sh
输出:
Reading files
Found in xyz.txt file
+ a=2
+ b=3
+ c=5
+ DEBUG set +x
+ '[' on == on ']'
+ set +x
2 + 3 = 5
现在设置 _DEBUG 为 off(你需求修改该文件):
_DEBUG="off"
运转脚本:
$ ./script.sh
输出:
Found in xyz.txt file
2 + 3 = 5
以上是一个简略但十分有用的技能。还能够测验运用 DEBUG 作为别号而不是函数。
 
调试 Bash Shell 的常见过错
Bash 或许 sh 或许 ksh 在屏幕上给出各种过错信息,在许多情况下,过错信息或许不供给具体的信息。
 
越过在文件上运用履行权限
当你 编写你的第一个 hello world 脚本,您或许会得到一个过错,如下所示:
bash: ./hello.sh: Permission denied
设置权限运用 chmod 指令:
$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
 
文件完毕时发生意外的过错
假如您收到文件完毕意外过错音讯,请翻开脚本文件,并保证它有翻开和封闭引号。在这个比如中,echo 句子有一个最初引号,但没有完毕引号:
#!/bin/bash
...
....
echo 'Error: File not found
^^^^^^^
missing quote
还要保证你检查短少的括号和大括号 {}:
#!/bin/bash
.....
[ ! -d $DIRNAME ] && { echo "Error: Chroot dir not found"; exit 1;
^^^^^^^^^^^^^
missing brace }
...
 
丢掉像 fi,esac,;; 等关键字。
假如你短少了完毕的关键字,如 fi 或 ;; 你会得到一个过错,如 “XXX 意外”。因而,保证一切嵌套的 if 和 case 句子以恰当的关键字完毕。有关语法要求的页面。在本例中,短少 fi:
#!/bin/bash
echo "Starting..."
....
if [ $1 -eq 10 ]
then
if [ $2 -eq 100 ]
then
echo "Do something"
fi
for f in $files
do
  echo $f
done
# 留意 fi 丢掉了
 
在 Windows 或 UNIX 框中移动或修改 shell 脚本
不要在 Linux 上创立脚本并移动到 Windows。另一个问题是修改 Windows 10上的 shell 脚本并将其移动到 UNIX 服务器上。这将因为换行符不同而导致指令没有发现的过错。你能够运用下列指令 将 DOS 换行转换为 CR-LF 的Unix/Linux 格局:
dos2unix my-script.sh
 
技巧
技巧 1 - 发送调试信息输出到规范过错
[规范过错] 是默许过错输出设备,用于写一切体系过错信息。因而,将音讯发送到默许的过错设备是个好主意:
# 写过错到规范输出
echo "Error: $1 file not found"
#
# 写过错到规范过错(留意 1>&2 在 echo 指令结尾)
#
echo "Error: $1 file not found" 1>&2
 
技巧 2 - 在运用 vim 文本修改器时,翻开语法高亮
大多数现代文本修改器答应设置语法高亮选项。这关于检测语法和防止常见过错如翻开或封闭引号十分有用。你能够在不同的色彩中看到。这个特性简化了 shell 脚本结构中的编写,语法过错在视觉上天壤之别。高亮不影响文本自身的含义,它只为你提示罢了。在这个比如中,我的脚本运用了 vim 语法高亮:
怎么调试 Bash Shell 脚本,在 Linux 或许 UNIX 运用 Vim 语法高亮特性
 
技巧 3 - 运用 shellcheck 检查脚本
shellcheck 是一个用于静态剖析 shell 脚本的东西。能够运用它来查找 shell 脚本中的过错。这是用 Haskell 编写的。您能够运用这个东西找到正告和主张。你能够看看如安在 Linux 或 类UNIX 体系上装置和运用 shellcheck 来改进你的 shell 脚本,防止过错和高效。
 
linux把cd指令写在bash shell脚本里不起作用:http://www.138comgov138.com/linux/29700.html
linux bash shell判别目录是否为空的函数:http://www.138comgov138.com/linux/25839.html
Linux Bash Shell快速入门:http://www.138comgov138.com/linux/6871.html
bash shell中expr指令下几种的运用:http://www.138comgov138.com/linux/4195.html
Bash Shell入门辅导手册:http://www.138comgov138.com/linux/1802.html