第八章 内部字段分隔符IFS、脚本调试DEBUG
内部字段分隔符
内部字段分隔符(internal field separator,IFS)是shell脚本中的一个特殊变量,在处理文本数据时很有用。把单个数据流划分成不同的数据元素的定界符,内部字段分隔符就是用于特定用途的定界符。IFS是存储定界符的环境变量,是shell环境中的默认定界符字符串,默认值为空白字符(换行符、制表符、空格)
迭代一个字符串或者CSV(comma separated value,都好分隔型数值)中的单词:
#!/bin/bash data="111,222,333,444,555,666" oldIFS=$IFS #定义一个变量为默认IFS IFS=,#设置IFS为逗号 for i in $data do echo S:$i done IFS=$oldIFS #还原IFS为默认值
运行结果:
S:111 S:222 S:333 S:444 S:555 S:666
上边示例 把IFS设置为逗号(,),shell将逗号解释为一个定界符,因此变量$i在每次迭代中读取由逗号分隔的字符串作为变量值。
shell脚本的调试
调试功能是每种编程语言都具备的特性之一,出现一些始料未及的情况,使用调试功能可以弄清除是什么原因发生了错误或者异常。shell脚本自身已经包含了调试的选项,能都打印出脚本接受的参数和输入。
1、使用选项 -x
-x :选项是打印所有行的信息
[root@ceshi ~]# bash -x 80.sh ++ grep /boot ++ df -hT ++ cut -d % -f1 ++ awk '{print $6}' + use=19 + '[' 19 -lt 80 ']' + echo 'Warning!!/boot disk is full' Warning!!/boot disk is full 或者 [root@ceshi ~]# sh -x 80.sh ++ df -hT ++ cut -d % -f1 ++ awk '{print $6}' ++ grep /boot + use=19 + '[' 19 -lt 80 ']' + echo 'Warning!!/boot disk is full' Warning!!/boot disk is full
2、使用set +/-x;set +/-v
示例
#!/bin/bash for i in {1..5} do set -x echo $i set +x done echo "end" 运行结果: 1 2 3 4 5 end + echo 1 + set +x + echo 2 + set +x + echo 3 + set +x + echo 4 + set +x + echo 5 + set +x
上例中,仅在-x和+x的区域中才会显示调试信息。
3、使用_DEBUG 环境变量
如果需要自定义格式显示调试信息可以通过_DEBUG环境变量来建立:
[root@ceshi ~]# vi d.sh #!/bin/bash DEBUG() { [ "$_DEBUG" = "on" ] && $@ || : } for i in {1..5} do DEBUG echo $i done
将调试功能设置为“on”来运行脚本:
[root@ceshi ~]# _DEBUG=on ./d.sh 1 2 3 4 5
将需要调试的行前加上DEBUG,运行脚本前没有加_DEBUG=on就不会显示任何信息,脚本中 ":" 告诉shell不要进行任何操作。
4、使用shebang调试方法
这个最便捷的方法。把shebang从 #!/bin/bash 修改成#!/bin/bash -xv,其他就不用做任何操作了。
示例:
[root@ceshi ~]# cat dd.sh #!/bin/bash -xv for i in {1..5} do echo $i done 运行结果: [root@ceshi ~]# ./dd.sh #!/bin/bash -xv for i in {1..5} do echo $i done + for i in '{1..5}' #从这里开始debug + echo 1 1 + for i in '{1..5}' + echo 2 2 + for i in '{1..5}' + echo 3 3 + for i in '{1..5}' + echo 4 4 + for i in '{1..5}' + echo 5 5