为啥循环生成的 Bash 数组值连接在一起?

Posted

技术标签:

【中文标题】为啥循环生成的 Bash 数组值连接在一起?【英文标题】:Why are loop generated Bash array values concatenated together?为什么循环生成的 Bash 数组值连接在一起? 【发布时间】:2022-01-16 23:04:24 【问题描述】:

我正在编写一个简短的脚本来自动输出文件名。测试文件夹有以下文件:

test_file_1.fa test_file_2.fa test_file_3.fa

到目前为止,我有以下内容:

#!/bin/bash

filenames=$(ls *.fa*)
output_filenames=$()
output_suffix=".output.faa"

for name in $filenames
do
        output_filenames+=$name$output_suffix
done

for name in $output_filenames
do 
        echo $name
done

这个的输出是:

test_file_1.fa.output.faatest_file_2.fa.output.faatest_file_3.fa.output.faa

为什么这个循环会将所有文件名“粘”在一起作为一个数组变量?

【问题讨论】:

您没有定义任何数组。 output_filenames=() 【参考方案1】:

shell 数组需要特定的语法。

output_filenames=()            # not $()
output_suffix=".output.faa"

for name in *.fa*              # don't parse `ls`
do
        output_filenames+=("$name$output_suffix")   # parentheses required
done

for name in "$output_filenames[@]"    # braces and index and quotes required
do 
        echo "$name"
done

https://tldp.org/LDP/abs/html/arrays.html 有更多使用数组的示例。

“不解析ls” => https://mywiki.wooledge.org/ParsingLs

【讨论】:

以上是关于为啥循环生成的 Bash 数组值连接在一起?的主要内容,如果未能解决你的问题,请参考以下文章

在bash中,如何将N个参数连接在一起作为空格分隔的字符串

如何将字符串列表连接在一起,每个值之间用逗号分隔?

如何在matlab中连接数组'n'时间?

“此处文档”的 EOF 中的 Bash 脚本数组循环

为啥我们不能直接在循环中使用“innerHTML”函数而不是连接文本以获得垂直书写列表?

r 与包含的bash一起,连接文件夹中的多个文件(使用foldername和filename)