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
答
您有几种选择:
- 一个herestring(注意,这是一个非POSIX扩展):
done <<<"$MY_VAR"
-
定界符文本(符合POSIX标准,将与
/bin/sh
工作):done <<EOF $MY_VAR EOF
一个进程替换(也是一个扩展,但使用
printf
而不是echo
使它在支持它的外壳上更具可预测性;看到POSIX spec forecho
应用用法说明):done < <(printf '%s\n' "$MY_VAR")
注意的是,前两个选项会(在bash)创建与变量的内容磁盘的临时文件,而最后一个使用FIFO 。
+0
感谢您的详细解释以及上面的有用评论。非常感激。 –
答
<
需要后面跟一个文件名。您可以使用下面的字符串:
done <<< "$MY_VAR"
或进程替换:
done < <(echo "$MY_VAR")
'回声$ line'是不一样的'回声 “$行”'。参见[BashPitfalls#14](http://mywiki.wooledge.org/BashPitfalls#echo_.24foo)。 –
此外,所有大写变量名称都用于具有shell或OS含义的变量,而带小写字母的名称则保证不会与系统操作发生冲突。请参阅http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html第四段。 –