1.脚本调试
调试功能是每一种编程语言都应该实现的重要特性之一,当出现一些始料未及的情况时,用它来生成脚本运行信息。调试信息可以帮你弄清除是什么原因使得程序发生崩溃或行为异常。
-x标识将脚本中执行过的每一行都输出到stdout。不过,我们也可能只关注脚本某些部分的命令及参数的打印输出。针对这种情况,可以在脚本中使用set builtin来启用或禁止调试打印。
set -x:在执行时显示参数和命令
set +x:禁止调试
set -v:当命令进行读取时显示输入
set +v:禁止打印输出
1)利用选项-x,启用shell脚本的跟踪调试功能
bash -x script.sh
2)使用set -x和set +x对脚本进行部分调试
for i in {1..6};
do
set -x
echo $i
set +x
done
echo "Script executed"
[lirong@lr ~/work_lr/mygit/shell]# sh script.sh
+ echo 1
1
+ set +x
+ echo 2
2
+ set +x
+ echo 3
3
+ set +x
+ echo 4
4
+ set +x
+ echo 5
5
+ set +x
+ echo 6
6
+ set +x
Script executed
3)自定义格式显示调试信息
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@ || :
}
for i in {1..10}
do
DEBUG echo $i
done
我们在每一个需要打印调试信息的语句前加上DEBUG。如果没有把_DEBUG=on传递给脚本,那么调试信息就不会打印出来。在Bash中,命令”:”告诉shell不要进行任何操作。
[lirong@lr ~/work_lr/mygit/shell]# _DEBUG=on sh debug.sh
1
2
3
4
5
6
7
8
9
10
[lirong@lr ~/work_lr/mygit/shell]# sh debug.sh
[lirong@lr ~/work_lr/mygit/shell]#
2.函数和参数
1)定义函数
function fname()
{
}
或者:
fname()
{
}
2)只需要使用函数名就可以调用某个函数
fname; #执行函数
3)参数可以传递给函数,并由脚本进行访问
fname arg1 arg2; #传递参数
以下是函数fname的定义。在函数fname中,包含各种访问函数参数的方法。
fname()
{
echo $1,$2; #访问参数1和参数2
echo "$@"; #以列表的方式一次性打印所有参数
echo "$*"; #类似于$@,但是参数被作为单个实体
return 0; #返回值
}
类似地,参数可以传递给脚本并通过script:$0访问
$1 是第一个参数。
$2 是第二个参数。
$n 是第n个参数。
"$@" 被扩展成 "$1" "$2" "$3" 等。
"$*" 被扩展成 "$1c$2c$3" ,其中 c 是IFS的第一个字符。
"$@" 要比 "$*" 用得多。由于 "$*" 将所有的参数当做单个字符串,因此它很少被使用。
4)导出函数
函数也能像环境变量一样用export导出,函数的作用域就可以扩展到子进程中
export -f fname
5)向命令传递参数
命令的参数能够以不同的格式进行传递。假设-p、-v是可用选项,-k N 是另一个可以接受数字的选项,同时该命令还接受一个文件名作为参数,那么,它有以下几种执行方式
$ command -p -v -k 1 file
$ command -pv -k 1 file
$ command -vpk 1 file
$ command file -pvk 1
2017-11-28-LR Linux shell攻略脚本