1. 程式人生 > >第八章 內部字段分隔符IFS、腳本調試DEBUG

第八章 內部字段分隔符IFS、腳本調試DEBUG

shel內部字段分隔符IFS腳本調試 shell腳本調試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

第八章 內部字段分隔符IFS、腳本調試DEBUG