shell语法检查或者查看shell脚本执行过程的参数介绍及两种使用方法
一、常用参数概述:
set -x 与 set +x
在liunx脚本中可用set -x就可有详细的日志输出,省的老是要echo了
用于脚本调试。set是把它下面的命令打印到屏幕
set -u 是显示语法未定义的变量,却使用了
set -x 是开启
set +x是关闭
set -o是查看 (xtrace),
set 去追踪一段代码的显示情况。
执行set -x后,对整个脚本有效。
如果针对部分代码有效,需要使用set +x,显示指定恢复;
例子:
[hd@data10 ~/work/test_shell]$ ls -l /bin/bash
+ ls --color=tty -l /bin/bash
-rwxr-xr-x 1 root root 722684 Jul 12 2006 /bin/bash
针对一部分script,可以选择 set -x 和 set +x配套使用。比如在一个脚本里:
set -x # activate debugging from here
w
set +x # stop debugging from here
二、其他常用的shell参数命令
set指令能设置所使用shell的执行方式,可依照不同的需求来做设置
-a 标示已修改的变量,以供输出至环境变量。
-b 使被中止的后台程序立刻回报执行状态。
-C 转向所产生的文件无法覆盖已存在的文件。
-d Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。
-e 若指令传回值不等于0,则立即退出shell。
-f 取消使用通配符。
-h 自动记录函数的所在位置。
-H Shell 可利用"!"加<指令编号>的方式来执行history中记录的指令。
-k 指令所给的参数都会被视为此指令的环境变量。
-l 记录for循环的变量名称。
-m 使用监视模式。
-n 只读取指令,而不实际执行。
-p 启动优先顺序模式。
-P 启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。
-t 执行完随后的指令,即退出shell。
-u 当执行时使用到未定义过的变量,则显示错误信息。
-v 显示shell所读取的输入值。
-x 执行指令后,会先显示该指令及所下的参数。
+<参数> 取消某个set曾启动的参数。
set -x 作用
一句话总结:显示脚本运行是的冗余输出,在set命令之后执行的每一条命令以及加载命令行中的任何参数都会显示出来,每一行都会加上加号(+),提示它是跟踪输出的标识。
set -o 查看
$ set -o
allexport off
braceexpand on
emacs on
errexit off
……
ignoreeof off
interactive-comments on
keyword off
monitor on
……
verbose off
vi off
xtrace off
参考:https://www.cnblogs.com/qqjue/archive/2012/07/25/2607683.html
三、上述的常用的u参数和x参数使用两种方式示例:
1、在shell脚本指定set -u参数,检测特定代码块里面未定义的变量错误:
[hd@data10 ~/work/test_shell]$ more u_test.sh
#!/bin/bash
thedate=$1
if ! test ${thedate}; then
thedate=$(/bin/date -d-1day "+%Y%m%d")
fi
echo $thedate
cwd=$(cd $(dirname $0); pwd)
logdir="${cwd}/logdir"
non_var1="$logdir11/yzzzz_data_merge/*"
echo "non_var1",$non_var1
jobname="yyz_data_merge_${thedate}"
echo ${jobname}
set -u
# 下面一行是未定义的变量
non_var2="yzzzz_data_merge/${thedateaaa}*/*"
echo "non_var2",$non_var2
set +u
echo $thedate
[hd@data10 ~/work/test_shell]$ bash ./u_test.sh
20190916
non_var1,/yzzzz_data_merge/*
yyz_data_merge_20190916
./uu_test.sh: line 15: thedateaaa: unbound variable
[hd@data10 ~/work/test_shell]$ more test.sh
#!/bin/bash
thedate=$1
if ! test ${thedate}; then
thedate=$(/bin/date -d-1day "+%Y%m%d")
fi
echo $thedate
cwd=$(cd $(dirname $0); pwd)
logdir="${cwd}/logdir"
jobname="yyz_data_merge_${thedate}"
echo ${jobname}
# 下面一行是未定义的变量
non_var="yzzzz_data_merge/${thedateaaa}*/*"
echo "non_var",$non_var
echo $thedate
[hd@data10 ~/work/test_shell]$ sh test.sh
20190916
yyz_data_merge_20190916
non_var,yzzzz_data_merge/*/*
20190916
[hd@data10 ~/work/test_shell]$ sh -u test.sh
test.sh: line 2: $1: unbound variable
2、在shell脚本指定set -x参数,显示shell代码执行过程的示例:
[hd@data10 ~/work/test_shell]$ sh -x test.sh
+ thedate=
+ test
++ /bin/date -d-1day +%Y%m%d
+ thedate=20190916
+ echo 20190916
20190916
+++ dirname test.sh
++ cd .
++ pwd
+ cwd=/home/hd/work/test_shell
+ logdir=/home/hd/work/test_shell/test_shell/logdir
+ jobname=yyz_data_merge_20190916
+ echo yyz_data_merge_20190916
yyz_data_merge_20190916
+ non_var='yzzzz_data_merge/*/*'
+ echo 'non_var,yzzzz_data_merge/*/*'
non_var,yzzzz_data_merge/*/*
+ echo 20190916
20190916
[hd@data10 ~/work/test_shell]$ sh -v test.sh
#!/bin/bash
thedate=$1
if ! test ${thedate}; then
thedate=$(/bin/date -d-1day "+%Y%m%d")
fi
/bin/date -d-1day "+%Y%m%d")
/bin/date -d-1day "+%Y%m%d"
echo $thedate
20190916
cwd=$(cd $(dirname $0); pwd)
cd $(dirname $0); pwd)
cd $(dirname $0); pwd
dirname $0)
dirname $0
logdir="${cwd}/logdir"
jobname="yyz_data_merge_${thedate}"
echo ${jobname}
yyz_data_merge_20190916
non_var="yzzzz_data_merge/${thedateaaa}*/*"
echo "non_var",$non_var
non_var,yzzzz_data_merge/*/*
echo $thedate
20190916
[hd@data10 ~/work/test_shell]$ sh -v test.sh 22
#!/bin/bash
thedate=$1
if ! test ${thedate}; then
thedate=$(/bin/date -d-1day "+%Y%m%d")
fi
echo $thedate
22
cwd=$(cd $(dirname $0); pwd)
cd $(dirname $0); pwd)
cd $(dirname $0); pwd
dirname $0)
dirname $0
logdir="${cwd}/logdir"
jobname="yyz_data_merge_${thedate}"
echo ${jobname}
yyz_data_merge_22
non_var="yzzzz_data_merge/${thedateaaa}*/*"
echo "non_var",$non_var
non_var,yzzzz_data_merge/*/*
echo $thedate
22