shell編程過程中,很多時候需要操作數組,而命令返回的一般都是字符串,如何将字符串根據指定的符号進行分割呢?
這裡就需要有到一個變量IFS( Internal Field Separator,内部的域分隔符),IFS的默認值為:空白(包括:空格,tab, 和新行)
如果直接用 echo $IFS看不出來,可以将結果用ASSII碼用十六進制打印出來:
echo -n "$IFS" | xxd -g 1
00000000: 20 09 0a ..
十六進制的20是32
十六進制的09是9
十六進制的0a是10
根據下面的圖就可以看出來是哪個符号:
ASCII 10進制
分割字符串如果要以默認的這三種符号進行分割,就不需要修改變量。
例子:
#!/bin/bash
a="one two three four"
array=($a)
for s in ${array[@]}
do
echo $s
done
執行結果:
如果是其他分割符,就需要修改這個變量。(修改的時候記得先保存一下變量,分割完就馬上賦值回去,防止下面輸出的格式變了)
例子:
#!/bin/bash
a="one,two,three,four"
OLD_IFS="$IFS"
IFS=","
array=($a)
IFS="$OLD_IFS"
for s in ${array[@]}
do
echo $s
done
執行結果:
array=($a)用于将字符串$a分割到數組$array ${array[0]} ${array[1]} ... 分别存儲分割後的數組第1 2 ... 項 ,${arr[@]}存儲整個數組。
IFS對空格的空白的處理和其他字符不一樣,左右兩邊的純空白會被忽略,多個連續的空白被當成一個IFS處理。
多個符号進行分割
#!/bin/bash
a="1,,,2::3"
OLD_IFS="$IFS"
IFS=",:"
array=($a)
IFS=OLD_IFS
for s in ${array[@]}
do
echo $s
done
執行結果:
總結
寫shell腳本不好debug,很容易出錯,可以使用bash -x scripts.sh 執行,來查看具體的執行步驟。shell腳本雖然方便,但是執行效率嘛。。。。。
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!