迭代存储在变量中的多行字符串

迭代存储在变量中的多行字符串

写这样的东西是不好的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

解释:

  1. $(compgen -v | grep -Ev '^(BASH)')- grep 环境列表,跳过那些以BASH
  2. echo "$var=${!var}"- 打印钥匙=价值

相关内容