需求是檢查指定應用的某些配置因此就寫了個腳本,數據文件的內容是這樣的:應用名稱|IP|端口 多個IP用空格,這樣能夠生成數組。這個文件的數據是經過部署平臺的API獲取後本身組裝的。shell
#!/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語句在命令行中均可以正常執行結果也是正確的。改變一下腳本輸出看看bash
#!/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認爲換行了。3d
bash shell默認將空格、製表符、換行符看作分隔符遇到這些字符shell會認爲這個字符後面的是一個新的字符。因此上面就分紅了3行輸出。但有時候咱們但願自定義這種分隔符來處理好比空格之類的東西,這就須要經過改變當前shell執行環境的分隔符定義。code
再次執行blog
針對最初的例子咱們也須要這樣修改部署
#!/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