1

我正在尝试使用变量,而不是在多个地方明确列出我的区域列表。

我意识到我可以下载所有文件,然后应用我正在寻找的文件。我觉得我应该能够做到这一点,我想这会让这有点学术练习。也许我的术语已经关闭,但我所做的大部分搜索都是基于整数的结果。下面的代码按原样工作......但我想{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

编辑:使用下面 Dzienny 的答案更新脚本

#!/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
4

1 回答 1

0

Bash 在扩展变量之前评估大括号扩展。这意味着如果您将大括号扩展字符串放入变量中并使用它,它将不会被解释,而是字符串将保持不变。

您可以使用evalbuiltin 来评估变量的内容。例子:

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/
于 2019-02-05T20:53:24.673 回答