一、IFS的概念
Shell 腳本中有個變量叫IFS(Internal Field Seprator) ,內部域分隔符
。
Shell 的環境變量分為set, env兩種,其中 set 變量可以通過 export 工具導入到 env 變量中。
其中,set 是顯示設置shell變量,僅在本 shell 中有效;env 是顯示設置用戶環境變量 ,僅在當前會話中有效。
換句話說,set 變量里包含了env 變量,但set變量不一定都是env 變量。這兩種變量不同之處在於變量的作用域不同。顯然,env 變量的作用域要大些,它可以在 subshell 中使用。
IFS 是一種 set 變量,當 shell 處理"命令替換"和"參數替換"時,shell 根據 IFS 的值,默認是 space, tab, newline 來拆解讀入的變量,然后對特殊字符進行處理,最后重新組合賦值給該變量
二、IFS概念實例操作
查看IFS的值發現env | grep IFS為空,而set | grep IFS有值,說明IFS是局部變量
IFS是以空格、制表符、換行符來進行分隔的
三、IFS實例操作一:設置分割符
#!/bin/bash #cat name.txt OLDIFS=$IFS #IFS=$"\n" IFS=$'\n' #IFS="\n" for i in $(cat name.txt) do echo $i done IFS=$OLDIFS
四、介紹 IFS 、$ 、單雙引號
1、單雙引號賦值給IFS的對比
IFS="\n" IFS=$"\n" IFS=$'\n'
這三個賦值看起來都比較像”將換行符賦值給IFS“,但實際上只有最后一種寫法才是我想要的結果。
IFS="\n" //將字符n作為IFS的換行符。
IFS=$"\n" //這里\n確實通過$轉化為了換行符,但僅當被解釋時(或被執行時)才被轉化為換行符;第一個和第二個是等價的
IFS=$'\n' //這才是真正的換行符。
2、IFS=‘\n’ 的輸出結果
3、IFS=$"\n" 的輸出結果
4、IFS="\n" 的輸出結果
五、while read的應用
1、格式
while read 變量名
2、用法一:格式
while read 變量名(line) do … done < file
read通過輸入重定向,把file的第一行所有的內容賦值給變量line,循環體內的命令一般包含對變量line的處理;
然后循環處理file的第二行、第三行...一直到file的最后一行。
read命令也有退出狀態,當它從文件file中讀到內容時,退出狀態為0,循環繼續;
當read從文件中讀完最后一行后,下次便沒有內容可讀了,此時read的退出狀態為非0,所以循環才會退出。
3、用法二:格式
command | while read line do … done
command命令的輸出作為read循環的輸入,這種結構常用於處理超過一行的輸出,當然awk也很擅長做這種事。
4、實例操作