Linux 下 Shell 命令 IFS 分隔符 – 应用场景 && 解决办法
场景一 – 变量输出
问题
问题描述
通过 "cat" 读取文件行,作为变量后,通过 echo 输出变量,变量值中 "相连的多个空格" 被 "合并为一个空格" 输出。
测试文件
$ cat test_IFS1.txt
a b c d e f g h i
1 2 3 4 5 6
操作
$ line=`tail -1 test_IFS1.txt` && echo ${line}
1 2 3 4 5 6
解决办法
通过定义 IFS
分隔符解决
$ IFS="\n" && line=`tail -1 test_IFS1.txt` && echo ${line} && unset IFS
1 2 3 4 5 6
场景二 – 文件读取
问题
问题描述
'cat 命令' 读取文件,通过 'for 循环' 输出每行内容,当行中存在空格,'echo 输出' 异常。
测试文件
$ cat test_IFS2.txt
line1 --- word1 word2 word3 word4
line2 --- word1 word2 word3 word4
line3 --- word1 word2 word3 word4
line4 --- word1 word2 word3 word4
操作
$ for line in `cat test_IFS2.txt`; do echo ${line}; done
line1
---
word1
word2
word3
word4
line2
---
word1
word2
word3
word4
line3
---
word1
word2
word3
word4
line4
---
word1
word2
word3
word4
解决办法
方法一:定义 IFS
分隔符
$ IFS=$'\n' && for line in `cat test_IFS2.txt`; do echo ${line}; done && unset IFS
line1 --- word1 word2 word3 word4
line2 --- word1 word2 word3 word4
line3 --- word1 word2 word3 word4
line4 --- word1 word2 word3 word4
- IFS='\n' -- 将字符 n 作为 IFS 的换行符
- IFS=$"\n" -- \n确实通过 '$' 转化为了换行符,但仅当被解释时(或被执行时)才被转化为换行符
- IFS=$'\n' -- 输出正常
方法二:while read
方式解决
$ cat test_IFS2.txt | while read line; do echo ${line}; done
line1 --- word1 word2 word3 word4
line2 --- word1 word2 word3 word4
line3 --- word1 word2 word3 word4
line4 --- word1 word2 word3 word4
参考