巴什while循环与读取和IFS(Bash while loop with read and IFS

2019-10-20 21:12发布

我要解析按以下格式的文件:

line1_param1:line1_param2:line1_param3:
line1_param2:line2_param2:line2_param3:
line1_param3:line3_param2:line3_param3:

而逐行处理它,从当前行提取所有参数。 目前,我已经成功它以这样一种方式:

IFS=":"
grep "nice" some_file | sort > tmp_file
while read param1 param2 param3
do
  ..code here..
done < tmp_file
unset IFS

我怎样才能避免创建临时文件?

不幸的是,这并不正常工作:

IFS=":"
while read param1 param2 param3
do
  ..code here..
done <<< $(grep "nice" some_file | sort)
unset IFS

由于整个线路被分配到参数1。

Answer 1:

您可以使用进程替换了这一点:

while IFS=: read -r param1 param2 param3
do
   echo "Any code here to process: $param1 $param2 $param3"
done < <(grep "nice" some_file | sort)


Answer 2:

如果你正在使用bash 4.2或更高版本,可以启用lastpipe选项可使用“天然”管道。 在while循环将在当前的外壳,而不是一个子shell执行,所以你设置变量或者改变仍然可以看到管道下面。 (从anubhava的罚款答案证明窃取代码。)

shopt -s lastpipe
grep "nice" some_file | sort | while IFS=: read -r param1 param2 param3
do
   echo "Any code here to process: $param1 $param2 $param3"
done


文章来源: Bash while loop with read and IFS