带引号条目的 For 循环

带引号条目的 For 循环

一个 for 循环,遍历带引号的标头列表:

for h in "header" "header 2"; do
    echo $h
done

回报

header
header 2

我想在其他地方引用标头来清理它,例如将它们分配给变量。

headers='"header" "header 2"'
for h in $headers; do
    echo $h
done

但这会返回

"header"
"header
2"

正如它应该。

有办法解决这个问题吗?它类似于这个帖子包含带有空格的文件列表,但我不处理文件,我想将它们保留在一行上,因为会有很多条目。

答案1

另一种方法是更改​​字段分隔符变量,例如:

headers="header,header 2"
IFS=,
for h in $headers; do
        echo $h
done

笔记:如果您有其他需要默认 IFS 值的循环,您可以首先将 IFS 值保存到临时变量中。

另请参阅man bash并搜索IFS更多信息。

答案2

我意识到解决这个问题的方法是使用逗号(或其他东西)而不是引号,并采用 csv 样式。现在它是一个简单的转换为行分隔。

headers="header,header 2"
headers=$(echo $headers | sed 's/,/\n/g')
printf "$headers\n" | while read h; do
    echo $h
done

不过,如果您有任何更优雅的解决方案,请分享。

相关内容