bash中变量的行循环

问题描述:

假定文件file具有多行。bash中变量的行循环

$ cat file 
foo 
bar 
baz 

进一步假设我希望通过while循环遍历每一行。

$ while IFS= read -r line; do 
$ echo $line 
$ # do stuff 
$ done < file 
foo 
bar 
baz 

最后,请假设我希望传递存储在变量中的行而不是存储在文件中的行。如何循环保存为变量的行而不会收到下面的错误?

$ MY_VAR=$(cat file) 
$ while IFS= read -r line; do 
$ echo $line 
$ # do stuff 
$ done < $(echo "$MY_VAR") 
bash: $(echo "$MY_VAR"): ambiguous redirect 
+0

'回声$ line'是不一样的'回声 “$行”'。参见[BashPitfalls#14](http://mywiki.wooledge.org/BashPitfalls#echo_.24foo)。 –

+0

此外,所有大写变量名称都用于具有shell或OS含义的变量,而带小写字母的名称则保证不会与系统操作发生冲突。请参阅http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html第四段。 –

您有几种选择:

  • 一个herestring(注意,这是一个非POSIX扩展):done <<<"$MY_VAR"
  • 定界符文本(符合POSIX标准,将与/bin/sh工作):

    done <<EOF 
    $MY_VAR 
    EOF 
    
  • 一个进程替换(也是一个扩展,但使用printf而不是echo使它在支持它的外壳上更具可预测性;看到POSIX spec for echo应用用法说明):done < <(printf '%s\n' "$MY_VAR")


注意的是,前两个选项会(在bash)创建与变量的内容磁盘的临时文件,而最后一个使用FIFO 。

+0

感谢您的详细解释以及上面的有用评论。非常感激。 –

<需要后面跟一个文件名。您可以使用下面的字符串:

done <<< "$MY_VAR" 

或进程替换:

done < <(echo "$MY_VAR")