内部字段分隔符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为默认值

执行结果:

[root@mail text]# ./6.sh
S:111
S:222
S:333
S:444
S:555
S:666

IFS被设置为逗号(,),shell将逗号解释为一个定界符,因此变量$i在每次迭代中读取由逗号分隔的字符串作为变量值。

Shell脚本的调试

调式功能是每种编程语言都具备的特性之一,出现一些始料未及的情况,使用调式功能可以弄清楚是什么原因发生了错误或者异常。shell脚本自身已经包含了调式选项,能都打印出脚本接受的参数和输入。

1、使用选项 -x

bash -x script.sh

或者

sh -x script.sh

-x 选项是打印所有行的信息。

2、使用 set +/-x ;set +/-v

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

示例

#!/bin/bash

for i in {1..5}
do
set -x
 echo $i
set +x
done

echo "end"

上例中,仅在 -x+x 的区域中才会显示调式信息。

3、使用 _DEBUG 环境变量

如果需要自定义格式显示调式信息可以通过_DEBUG环境变量来建立:

#!/bin/bash

DEBUG() {
[ "$_DEBUG" = "on" ] && $@ || :
}

for i in {1..5}
do
DEBUG echo $i
done

将调试功能设置为“on”来运行脚本:

_DEBUG=on ./script.sh

将需要调式的行前加上DEBUG,运行脚本前没有加_DEBUG=on就不会显示任何信息,脚本中“:”告诉shell不要进行任何操作。

4、使用shebang调式方法

这是最便捷的方法。把shebang 从#!/bin/bash 修改成 #!/bin/bash -xv ,其他就不用做任何操作了。