Linux自定義分隔符IFS引發的文字處理問題
阿新 • • 發佈:2019-01-13
需求是檢查指定應用的某些配置所以就寫了個指令碼,資料檔案的內容是這樣的:應用名稱|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