我读写这样的东西是不好的for line in $(command)
,正确的方法似乎是:
command | while IFS= read -r line; do echo $line; done
这很好用。但是如果我想要迭代的是 a 的内容怎么办?多变的,不是命令的直接结果?
例如,假设您创建以下文件quickfox
:
The quick brown
foxjumps\ over -
the
lazy ,
dog.
我希望能够做这样的事情:
# This is just for the example,
# I could of course stream the contents to `read`
variable=$(cat quickfox);
while IFS= read -r line < $variable; do echo $line; done; # this is incorrect
答案1
在像 bash 和 zsh 这样的现代 shell 中,您有一个非常有用的“<<<”重定向器,它接受字符串作为输入。所以你会做
while IFS= read -r line ; do echo $line; done <<< "$variable"
否则,你总是可以做
echo "$variable" | while IFS= read -r line ; do echo $line; done
答案2
如何使用多行值迭代环境变量的示例:
for var in $(compgen -v | grep -Ev '^(BASH)'); do
echo "$var=${!var}"
done
解释:
$(compgen -v | grep -Ev '^(BASH)')
- grep 环境列表键,跳过那些以BASH
echo "$var=${!var}"
- 打印钥匙=价值对