-x
调试选项。 这指示shell在终端上执行时显示所有命令及其参数。 我们将使用下面的
sys_info.sh
shell脚本,它简要地打印你的系统日期和时间,登录的用户数和系统正常运行时间。但是,它包含我们需要查找和更正的语法错误。
#!/bin/bash #script to print brief system info ROOT_ID="0" DATE=`date` NO_USERS=`who | wc -l` UPTIME=`uptime` check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "You are not allowed to execute this program!" exit 1; } print_sys_info(){ echo "System Time : $DATE" echo "Number of users: $NO_USERS" echo "System Uptime : $UPTIME } check_root print_sys_info exit 0保存文件并使脚本可执行。该脚本只能由root运行,因此使用 sudo命令运行它如下所示:
$ chmod +x sys_info.sh $ sudo bash -x sys_info.sh
Shell跟踪 - 在脚本中显示错误
$ sudo bash -n sys_info.sh
语法检查脚本
if statement
缺少一个闭合的
fi
字。因此,让我们添加它,新脚本现在应该如下所示:
#!/bin/bash #script to print brief system info ROOT_ID="0" DATE=`date` NO_USERS=`who | wc -l` UPTIME=`uptime` check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "You are not allowed to execute this program!" exit 1; fi } print_sys_info(){ echo "System Time : $DATE" echo "Number of users: $NO_USERS" echo "System Uptime : $UPTIME } check_root print_sys_info exit 0再次保存文件并以root身份调用它,并进行一些语法检查:
$ sudo bash -n sys_info.sh
在Shell脚本中执行语法检查
print_sys_info
函数中最后一个
echo命令中缺少闭合双引号
(”)
。 我们将在
echo命令中添加闭合双引号并保存文件。更改的脚本如下:
#!/bin/bash #script to print brief system info ROOT_ID="0" DATE=`date` NO_USERS=`who | wc -l` UPTIME=`uptime` check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "You are not allowed to execute this program!" exit 1; fi } print_sys_info(){ echo "System Time : $DATE" echo "Number of users: $NO_USERS" echo "System Uptime : $UPTIME" } check_root print_sys_info exit 0现在语法检查脚本一次。
$ sudo bash -n sys_info.sh上面的命令不会产生任何输出,因为我们的脚本语法上正确。我们也可以跟踪脚本的执行第二次,它应该工作很好:
$ sudo bash -x sys_info.sh
跟踪Shell脚本执行
$ sudo ./sys_info.sh
显示日期,时间和正常运行时间的Shell脚本
Shell脚本执行跟踪的重要性
Shell脚本跟踪帮助我们识别语法错误,更重要的是,识别逻辑错误。例如,在sys_info.sh
shell脚本中的
check_root
函数,它用于确定用户是否为root,因为脚本只允许由超级用户执行。
check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "You are not allowed to execute this program!" exit 1; fi }魔术在这里被控制的
if statement
表达
[ "$UID" -ne "$ROOT_ID" ]
,一旦我们不使用合适的数字运算符(
-ne
在这种情况下,这意味着不相等),我们结束了一个可能的逻辑错误。 假设我们使用
-eq
(意思等于),这将允许任何系统用户以及root用户运行脚本,因此是一个逻辑错误。
check_root(){ if [ "$UID" -eq "$ROOT_ID" ]; then echo "You are not allowed to execute this program!" exit 1; fi }注意 :我们在本系列开头介绍的是,shell shell内置命令可以在shell脚本的特定部分激活调试。 因此,下面的行将帮助我们通过跟踪它的执行在函数中找到这个逻辑错误: 具有逻辑错误的脚本:
#!/bin/bash #script to print brief system info ROOT_ID="0" DATE=`date` NO_USERS=`who | wc -l` UPTIME=`uptime` check_root(){ if [ "$UID" -eq "$ROOT_ID" ]; then echo "You are not allowed to execute this program!" exit 1; fi } print_sys_info(){ echo "System Time : $DATE" echo "Number of users: $NO_USERS" echo "System Uptime : $UPTIME" } #turning on and off debugging of check_root function set -x ; check_root; set +x ; print_sys_info exit 0保存文件并调用脚本,我们可以看到一个正常的系统用户可以运行脚本,没有 sudo ,如下面的输出。 这是因为 USER_ID的值为 100 ,不等于根 ROOT_ID为 0 。
$ ./sys_info.sh
运行Shell脚本而不使用Sudo