【发布时间】:2019-02-05 20:22:50
【问题描述】:
我正在尝试使用变量,而不是在多个位置显式列出我的区域列表。
我意识到我可以下载所有文件,然后应用我正在寻找的文件。我觉得我应该能够做到这一点,我想这会让这有点学术练习。也许我的术语是关闭的,但我所做的大部分搜索都是基于整数的结果。下面的代码按原样工作......但我想用$zone_list 变量替换{ru,cn...}。这很容易成为文件扩展名或类型{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
【问题讨论】:
-
你的方法听起来很理智。在您第一次评论的 wget 中,您得到的是
{$zone_list}而不是${zone_list}。 -
我应该提到我尝试了
${}{$}{${}}甚至eval的各种组合,将大括号嵌入zone_list而不是。没有一个像我希望的那样奏效。 -
这应该可行,使用第二个定义:
zone_list="{ru,cn,in,hk}"。听起来您是 shell 新手,并且不完全了解 shell 替换。我建议制作一个极简脚本来设置一个变量并将echos 作为消息的一部分退出。实验看看它是如何工作的。之后,将 echo 替换为for循环和echo分段,并尝试在for和echo中引用,以便了解引用的工作原理。另一种 shell 故障排除方法是使用bash -x my_script运行脚本,该脚本显示正在执行的行。
标签: linux bash variable-expansion brace-expansion