Зацикливать аргумент оболочки, который содержит список значений, и записывать эти значения в файл - PullRequest
1 голос
/ 07 мая 2019

У меня есть сценарий оболочки в Linux, которому в качестве входных данных требуется один аргумент, который может содержать список IP-адресов. Этот список нужно записывать построчно в файл.

./myTestScript.sh 192.168.100.2,192.168.100.3

В скрипте генерируется вывод

192.168.100.2 OK
192.168.100.3 OK 

и записывается в файл с именем exceptions.map.

МОЯ идея для одного IP работает, но как реализовать цикл или список из аргументов.

#!/bin/sh
IPADRESSES=$1
echo $IPADRESSES
sudo rm /appli/myApp/apps/mainApp/maintenance/exceptions.map
echo $IPADRESSES OK > "/appli/myApp/apps/mainApp/maintenance/exceptions.map"

Ответы [ 3 ]

1 голос
/ 08 мая 2019

Одна команда без цикла:

$ printf '%s OK\n' ${1//,/ } > "/appli/myApp/apps/mainApp/maintenance/exceptions.map"

${1//,/ } разделяет аргумент команды, заменяя все запятые пробелами.printf печатает каждый IP в соответствии с вашим форматом.

${1//,/ } также может использоваться в цикле:

for ip in ${1//,/ }; do something with "$ip"; done
1 голос
/ 07 мая 2019
#!/bin/sh

echo "$1" | tr , \\n | sed 's/$/ OK/' > exceptions.map

Или, если вы действительно хотите написать цикл:

IFS=,
for i in $1; do
        echo "$i OK"
done

Обратите внимание, что $1 здесь должно оставаться без кавычек, поскольку мы явно полагаемся на разделение слов. Но обычно я бы немного изменил API, чтобы вызывающий абонент передавал каждый IP в качестве отдельного компонента и выполнял for x; do echo "$x OK"; done.

0 голосов
/ 07 мая 2019

Вот способ чистого удара:

#!/bin/bash

IFS=, read -ra addresses <<<"$1"
for addr in "${addresses[@]}"; do
    echo "$addr OK"
done > exceptions.map

Строка IFS=... считывает разделенное запятыми содержимое первого аргумента $1 в массив addresses. Они разделены запятыми из-за IFS=,. Затем цикл for печатает каждый адрес по очереди, а также OK.

...