将Bash用竖线分隔的字符串放入命令的参数中

时间:2018-08-03 10:54:40

标签: bash shell io-redirection

让我们的加密允许您指定多个允许的域:

certbot certonly -d foo.example.com -d bar.example.com

是否有一种管道用逗号分隔的字符串,以便每个分隔的元素用作参数?像这样:

echo 'foo.example.com,bar.example.com' | magic_function 'certbot certonly {-d}'

这类似于xargs,但我希望所有令牌最终都分配给同一进程。

(事实证明certbot只会接受以逗号分隔的域列表,但是如果不接受,该怎么办?)

2 个答案:

答案 0 :(得分:3)

我认为这需要使用数组来实际构建命令。假设您有一个以逗号分隔的URL列表作为输入。首先将它们读入数组

inputStr='foo.example.com,bar.example.com'
IFS=, read -ra urlList <<<"$inputStr"

现在使用数组使用-d开关构造命令。

domainList=()
for url in "${urlList[@]}"; do
    domainList+=(-d "$url")
done

现在将构造的数组传递给命令

certbot certonly "${domainList[@]}"

对此进行扩展,简单地说就是使它成为一个包含URL列表并在其上运行命令的函数

runCertbot() {
    (( $# )) || { printf 'insufficient args provided\n' >&2; return 1; }
    IFS=, read -ra urlList <<<"$@"
    domainList=()
    for url in "${urlList[@]}"; do
        domainList+=(-d "$url")
    done
    certbot certonly "${domainList[@]}"         
}

并调用以下函数

runCertbot 'foo.example.com,bar.example.com'

答案 1 :(得分:1)

怎么样

certbot certonly -d $(echo 'foo.example.com,bar.example.com' | sed -e 's/,/ -d /')

'sed'用'-d'替换每个逗号。您只需要添加前导“ -d”。