第八章 内部字段分隔符IFS、脚本调试DEBUG

前端之家收集整理的这篇文章主要介绍了第八章 内部字段分隔符IFS、脚本调试DEBUG前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

第八章 内部字段分隔符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

  • 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"

运行结果:
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

猜你在找的Bash相关文章