我尝试使用变量,而不是在多个位置明确列出我的区域列表。
我意识到我可以下载所有文件,然后仅应用我要查找的文件。我觉得我应该能够做到这一点,我想这使这有点学术性的练习。也许我的术语不正确,但是我完成的大多数搜索都基于整数来显示结果。下面的代码按原样工作...但是我想将{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
答案 0 :(得分:0)
Bash evaluates brace expansions,然后再扩展变量。这意味着,如果将大括号扩展字符串放入变量中并使用它,它将不会被解释,而字符串将保持不变。
您可以使用内置的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/