shell命令之 IFS 分隔符;cat逐行读取文件
情景
我们经常会使用 cat 命令读取文件,但当行内有空白符
(空格、tab、换行)时就不会按行输出了
文件内容
a b
1 2
3 4
脚本内容
for i in `cat file`
do
echo $i
done
结果内容
a
b
1
2
3
4
解决方案
方案1 while read的应用
格式1
while read line
do
echo $line
done < file
格式2
cat file | while read line
do
echo $line
done
read
通过输入重定向
,把file的第一行所有的内容赋值给变量line,循环体内的命令一般包含对变量line的处理
方案2 设置分割符
IFS=$'\n' # 定义分割符
# for i in $(cat file) # better
# for i in $(<file) # in bash
for i in `cat file`
do
echo "$i"
done
IFS="\n"
# 将字符n作为IFS的换行符。
IFS=$"\n"
# 这里\n确实通过$转化为了换行符,但仅当被解释时(或被执行时)才被转化为换行符;第一个和第二个是等价的
IFS=$'\n'
# 这才是真正的换行符。
解释
Shell 脚本中有个变量叫IFS(Internal Field Seprator)
,内部域分隔符
。
Shell 的环境变量分为set
, env
两种,其中 set
变量可以通过 export
工具导入到 env
变量中。
其中,set
是显示设置shell变量
,仅在本 shell
中有效;env
是显示设置用户环境变量
,仅在当前会话中有效。
IFS
是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline
来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量.
IFS 详细内容可参考:https://www.cnblogs.com/weq0805/p/15027357.html