linux - 变量/参数扩展中的字符串项

标签 linux bash variable-expansion brace-expansion

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

我意识到我可以只下载所有文件,然后只应用我要查找的文件。我觉得我应该能够做到这一点,而且我想这使它成为一种学术练习。也许我的术语不对,但我所做的大部分搜索都基于整数得出了结果。下面的代码按原样工作...但我想用 $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

最佳答案

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/

关于linux - 变量/参数扩展中的字符串项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54542449/

相关文章:

Linux Fultter 桌面 - 无法从已编译的可执行文件运行应用程序,flutter run 有效

linux - 将前一天的文件发送到 unix 中的服务器

linux - 通过命令提示符设置 cronjob

bash - bash脚本;在多个远程服务器中复制并chmod和untar文件

bash - 比较目录中不包括多个硬链接(hard link)的所有文件的 md5

python - Bluez示例-广告间隔linux

linux - 如何有效地循环 Bash 中的文件行?

postgresql - 我如何在 Postgres 脚本中使用变量?

java - 在 Java 属性中使用 Groovy 进行变量扩展

bash - 在 bash 字符串变量中扩展花括号和通配符(不带 eval)