Строковые элементы в Переменном / Расширении Параметра - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь использовать переменную вместо явного перечисления моего списка зон в нескольких местах.

Я понимаю, что могу просто скачать все файлы и просто применить те, которые я ищу,Я чувствую, что я должен быть в состоянии сделать это, и я думаю, что это делает это немного академическим упражнением.Возможно, моя терминология отключена, но большинство поисков, которые я провел, показывали результаты, основанные на целых числах.Код ниже работает как есть ... но я бы хотел поменять {ru,cn...} с переменной $zone_list.Это так же легко может быть расширение или тип файла {jpg,php,htm,html} ... я не здесь, или мне стоит подумать об этом по-другому ??

#!/bin/bash

ipset=/sbin/ipset
## zone_list="ru,cn,in,hk"
## zone_list="{ru,cn,in,hk}"

## wget -N http://www.ipdeny.com/ipblocks/data/countries/{$zone_list}.zone -P ~/testing/iptables/blacklists/zones/
wget -N http://www.ipdeny.com/ipblocks/data/countries/{ru,cn,in,hk}.zone -P ~/testing/iptables/blacklists/zones/

## $ipset -F
## $ipset -N -! blacklist hash:net maxelem 262144

for ip in $(cat ~/testing/iptables/blacklists/zones/{ru,cn,in,hk}.zone); do
   ##  $ipset -A blacklist $ip
   echo $ip
done

Редактировать: Обновлен скрипт с ответом отДзенны ниже

#!/bin/bash

ipset=/sbin/ipset
zone_list="{ru,cn,in,hk}"

eval "urls=(http://www.ipdeny.com/ipblocks/data/countries/${zone_list}.zone)"
wget -N "${urls[@]}" -P /srv/iptables-data/blacklists/zones/

## BLACKZONE RULE (select country to block and ip/range)
## $ipset -F
## $ipset -N -! blacklist hash:net maxelem 262144

eval "zonefiles=(/srv/iptables-data/blacklists/zones/${zone_list}.zone)"
for ip in $(cat "${zonefiles[@]}"); do
   ## $ipset -A blacklist $ip
   echo $ip
done

1 Ответ

0 голосов
/ 05 февраля 2019

Bash оценивает расширения скобки перед расширением переменных.Это означает, что если вы поместите строку расширения в фигурную скобку в переменную и будете использовать ее, она не будет интерпретироваться, вместо этого строка останется неизменной.

Вы можете использовать eval встроенную функцию для оценки содержимого переменной.Пример:

zones_exp="{ru,cn,in,hk}"
eval "urls=(http://www.ipdeny.com/ipblocks/data/countries/${zones_exp}.zone)"
wget -N "${urls[@]}" -P ~/testing/iptables/blacklists/zones/

Или вы можете добиться дедупликации расширения скобок, создав вспомогательную функцию, например:

function insert_zones_exp() {
  expansion=("$1"{ru,cn,in,hk}"$2");
}

, где первый аргумент - это часть перед зоной, а вторая частьпосле значения зоны.

А затем используя его:

insert_zones_exp "http://www.ipdeny.com/ipblocks/data/countries/" ".zone"
wget -N "${expansion[@]}" -P ~/testing/iptables/blacklists/zones/
...