需求是檢查指定應用的某些配置所以就寫了個腳本,數據文件的內容是這樣的:應用名稱|IP|端口 多個IP用空格,這樣可以生成數組。這個文件的數據是通過部署平台的API獲取后自己組裝的。

#!/bin/bash
CONFIG_PATH="temp.txt"
for line in $(cat $CONFIG_PATH); do
APPNAME=$(echo $line | awk -F "|" '{print $1}')
IPARRAY=($(echo $line | awk -F "|" '{print $2}'))
PORT=$(echo $line | awk -F "|" '{print $3}')
echo $APPNAME
for IP in ${IPARRAY[@]}; do
echo $IP
done
done
腳本運行之后結果去不正確,因為在腳本中並沒有輸出端口

從要處理的文件上看本身沒有問題,也沒有特殊字符。上面的AWK語句在命令行中都可以正常執行結果也是正確的。改變一下腳本輸出看看
#!/bin/bash
CONFIG_PATH="temp.txt"
for line in $(cat $CONFIG_PATH); do
APPNAME=$(echo $line | awk -F "|" '{print $1}')
IPARRAY=($(echo $line | awk -F "|" '{print $2}'))
PORT=$(echo $line | awk -F "|" '{print $3}')
echo $APPNAME
echo $IPARRAY
echo $PORT
# for IP in ${IPARRAY[@]}; do
# echo $IP
# done
done

但看到這樣的結果肯定不對,那么就很容易聯想到分隔符問題。下面看這樣一個簡單的例子可能更加容易明白

這里明明是一行,我想輸出的也是一行可是輸出了三行,唯一的可能就是shell認為換行了。
bash shell默認將空格、制表符、換行符看做分隔符遇到這些字符shell會認為這個字符后面的是一個新的字符。所以上面就分成了3行輸出。但有時候我們希望自定義這種分隔符來處理比如空格之類的東西,這就需要通過改變當前shell執行環境的分隔符定義。

再次執行

針對最初的例子我們也需要這樣修改
#!/bin/bash
CONFIG_PATH="temp.txt"
IFS_OLD=$IFS # 保存當前IFS
IFS=$'\n' # 定義新的分隔符
for line in $(cat $CONFIG_PATH); do
APPNAME=$(echo $line | awk -F "|" '{print $1}')
IPARRAY=($(echo $line | awk -F "|" '{print $2}'))
PORT=$(echo $line | awk -F "|" '{print $3}')
echo $APPNAME
echo $IPARRAY
echo $PORT
# for IP in ${IPARRAY[@]}; do
# echo $IP
# done
done
IFS=$IFS_OLD # 恢復默認的IFS

