Строка Bash с разделителями в аргументах команды

Let's Encrypt позволяет указать несколько разрешенных доменов:

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 ответа

Решение

Я думаю, что это требует использования массива для фактического построения вашей команды. Предполагая, что в качестве входных данных используется список 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'

Как насчет

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

"sed" заменяет каждую запятую на "-d". Вам нужно только добавить ведущий ' -d '.

Другие вопросы по тегам