Строка 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 '.