![从文本文件生成多个 Bash 选项?](https://linux22.com/image/699429/%E4%BB%8E%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E7%94%9F%E6%88%90%E5%A4%9A%E4%B8%AA%20Bash%20%E9%80%89%E9%A1%B9%EF%BC%9F.png)
我有一个以域名为选项的命令。我有一长串域名要包含,所以我想自动将该域名列表解析到命令中。
例如,最简单的用法是command --option=example-one.com --output=file.ext
。添加域列表后,最终执行的命令将如下所示command --option=example-one.com ... --option=example-99.io --output=file.ext
(其中‘...’表示还有 97 个选项,此处以缩写形式显示)
这可以在 Bash 中实现吗?如果可以,请问它叫什么?
这是我尝试过的没有迄今的工作:
command --option=$(cat domains.txt) --output=file.ext
command "$(while read baddomains ; do echo -n '--option=$baddomains ' ; done < domains.txt)" --output=file.ext
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