从文本文件生成多个 Bash 选项?

从文本文件生成多个 Bash 选项?

我有一个以域名为选项的命令。我有一长串域名要包含,所以我想自动将该域名列表解析到命令中。

例如,最简单的用法是command --option=example-one.com --output=file.ext。添加域列表后,最终执行的命令将如下所示command --option=example-one.com ... --option=example-99.io --output=file.ext (其中‘...’表示还有 97 个选项,此处以缩写形式显示)

这可以在 Bash 中实现吗?如果可以,请问它叫什么?

这是我尝试过的没有迄今的工作:

  1. command --option=$(cat domains.txt) --output=file.ext
  2. command "$(while read baddomains ; do echo -n '--option=$baddomains ' ; done < domains.txt)" --output=file.ext
  3. command --option="domains.txt" --output=file.ext

该命令while read baddomains ; do echo -n '--option=$baddomains ' ; done < domains.txt > all-options.txt确实将格式完美的选项列表输出到新文件 all-options.txt 中,但我不明白如何将选项的输出重定向回命令,而不是文本文件。

如果重要的话,域名列表包括西里尔字符。

答案1

command $(printf -- "--option=%s " $(<domains.txt)) --output=file.ext

是我所知道的最紧凑的方式。

你应该尝试的是

command $(while read baddomains ; do echo -n "--option=$baddomains " ; done < domains.txt) --output=file.ext

但它对你不起作用,因为你在子 shell 中使用了错误的引号,并且将整个引号括$()在双引号中,因此command将整个引号视为一个参数。

如果重要的话,域名列表包括西里尔字符。

这些命令并不重要,但如果它们没有经过正确的 Punycode 编码,它们怎么会是有效的域名呢?如果它们经过 Punycode 编码,shell 将看不到任何西里尔字符。在这两种情况下,它都会愉快地正确处理其输入。

答案2

您可以使用以下参数构建一个数组:

args=()
while read -r domain _; do
    args+=("--option=$domain")
done < domains.txt

command "${args[@]}" --output=file.ext

相关内容