2016-05-02 2 views
1

У меня есть цикл for, который принимает CIDR, который содержит недопустимый символ для имен файлов ("/").Bash for loop - имя переменной изменения

Часть команды состоит в том, чтобы сохранить результат с именем CIDR.

for i in $(more subnets.lst);do shodan download $i-shodan net:$i;done 

загрузки аргумент сопровождается результате дополнительной команды, которые являются CIDR (192.168.21.0/24).

Есть ли способ в bash переименовать переменную во время работы цикла? Я помню, как делал это лет назад в пакетных файлах, вычитая из длины str, но это мне не поможет, так как мне просто нужно заменить «/» на «-» (или любой другой соответствующий символ).

+0

Обратите внимание, что вы можете предоставить несколько подсетей в «чистый» фильтр в Shodan, разделив их запятой. Например, вы можете: net: 192.168.21.0/24,172.20.0.0/16.8.8.8.8 – achillean

ответ

7

Вы можете сделать это с помощью bash параметра Expansion:

$ echo $var 
192.168.21.0/24 

$ echo "${var//\//-}" 
192.168.21.0-24 

Так что в вашей команде, просто использовать "${i//\//-}" по мере необходимости без изменения первоначальной стоимости $i. Если вы хотите установить переменную i на новое значение:

i="${i//\//-}" 

На стороне записки, используйте while цикл для чтения строк из файла, а не cat, more или братьев, как:

while IFS= read -r line; do ....; done 
0

Я работал его для себя:

for i in $(more subnets-test);do shodan download $(echo $i | tr "/" "-") net:$i;done