Linux Shell脚本攻略-调试脚本+函数和参数

调试脚本

可以利用Bash内建的调试工具或按照易于调试的方式编写脚本

# 1. 使用选项-x,启用shell脚本的跟踪调试功能
$ bash -x script.sh # 打印出所执行的每一行命令以及当前状态
$ sh -x script.sh

# 2. 使用set -x和set +x对脚本进行部分调试
#!/bin/bash
# FileName: debug.sh
for i in {1..6};
do
	set -x
	echo $i
	set +x
done
echo "Script executed"
# 上面的脚本中,只会打印出echo $i的调试信息,因为使用-x和+x对调试区域进行了限制
# 用{start..end}来迭代从start到end之间的值。这个语言构建(construct)在执行速度上要比seq命令略快

# 3. 使用自定义的调试信息
## 可以通过定义_DEBUG环境变量来启用或禁止调试及生成特定形式的信息
#!/bin/bash
function DEBUG()
{
	[ "$_DEBUG" == "on" ] && $@ || :
}
for i in {1..10}
do
	DEBUG echo "I is $i"
done

## 可以将调试功能设置为on来运行上面的脚本
## 在每条需要调试信息的语句前加上DEBUG
## 在Bash中,命令:告诉shell不要进行任何操作
$ _DEBUG=on  ./script.sh

set -x 在执行时显示参数和命令
set +x 禁止调试
set -v 当命令进行读取时显示输入
set +v 禁止打印输入

shebang的妙用

把shebang从#!/bin/bash改成#!/bin/bash -xv的话,不用任何其它选项就可以启用调试功能了
如果每一行前面都加上+,那么就很难再默认输出中跟踪执行流程了。可以将环境变量PS4设置为’$LINENO:’,显示出每行的行号

PS4='$LINENO:'

调试的输出信息可能会很长,如果使用了-x或set -x,调试输出会被发送到stderr

sh -x testScript.sh 2> debugout.txt

exec 6> /tmp/debugout.txt
BASH_XTRACEFD=6

函数和参数

函数参数可以在函数体中任意位置上使用,而别名只能将参数放在命令尾部

# 1. 函数定义
function fname()
{
	statements;
}

fname()
{
	statements;
}

# 简单函数可以如以下定义
fname() {statement;}

# 2. 只需函数名就可以调用函数
$ fname; # 执行函数

# 3. 函数参数可以按位置访问,$1是第一个参数,$2是第二个参数,依此类推
fname arg1 arg2; # 传递参数

fname()
{
	echo $1, $2; # 访问参数1和参数2
	echo "$@"; # 以列表方式一次性打印所有参数
	echo "$*"; # 类似于$@,但是所有参数被视为单个实体
	return 0; # 返回值
}

传入脚本的参数可以通过下列形式访问
$0 是脚本名称
$1 是第一个参数
$2 是第二个参数
$n 是第n个参数
$@ 被扩展成$1 $2 $3 等
$* 被扩展成 $1c$2c$3,其中c是IFS的第一个字符
$@ 要比 $* 用的多, 由于 $*将所有的参数当作单个字符串,因此很少被使用

比较别名和函数

# 下面的这个别名通过将ls的输出传入grep来显示文件子集
# 别名的参数添加到命令的尾部,因此lsg txt被扩展成ls | grep txt
$ alias lsg='ls | grep'
$ lsg txt
file1.txt
file2.txt
file3.txt

# 下面的命令能获得/sbin/ifconfig文件中设备对应的IP地址
$ alias wontWork='/sbin/ifconfig | grep'
$ wontWork eth0
eth0	Link	encap:Ethernet	HWaddr	00:11::22::33::44:55

$ function getIP() { /sbin/ifconfig $1 | grep 'inet'; }
$ getIP eth0
inet	addr:192:168.1.2	Bcast:192.168.255.255	Mask:255.255.0.0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值