0
我正在处理一个加载一些iptables列表并将每行写入相关链文件的小脚本。 只有当脚本在空目录中运行时,这一切才有效。 据我了解正确,这是由于我有*存储的值的数组。只要调用带*的行,该值将被当前目录中的所有文件替换。bash,使用带*的数组
你们知道一个简单的解决方案在非空文件夹中运行脚本吗?
这里是输出的一个例子,当脚本〜
LOG tcp -- Bilder Dokumente Downloads Musik Öffentlich Schreibtisch Videos Vorlagen eth1 !125.238.212.131 0.0.0.0/0 tcp dpt:45 LOG flags 0 level 4 prefix `LOGSMTP '
LOG tcp -- Bilder Dokumente Downloads Musik Öffentlich Schreibtisch Videos Vorlagen eth1 !125.238.212.131 0.0.0.0/0 tcp dpt:225 LOG flags 0 level 4 prefix `LOGSMTP '
运行,这里是输出的一个例子,当它在一个空文件夹 运行(这应该是这样的)
LOG tcp -- * eth1 !125.238.212.131 0.0.0.0/0 tcp dpt:45 LOG flags 0 level 4 prefix `LOGSMTP '
LOG tcp -- * eth1 !125.238.212.131 0.0.0.0/0 tcp dpt:225 LOG flags 0 level 4 prefix `LOGSMTP '
,这里是脚本
#!/bin/bash
cd /scripts/s.iptables.d/work
data=$(ls /scripts/s.iptables.d/iptables*)
for file in $data
do
outputpath="/output/s.iptables-"
while read -r line
do
arr=($line)
case "$line" in
Chain*) chain=${arr[1]}
output=$outputpath$chain
inactiveoutput=$outputpath$chain"-inactive"
;;
[1-9]*) reg="^[0-9]*\s+0\s+0.*$"
if [[ "$line" =~ "$reg" ]]
then
echo "${arr[@]:3}" >> $inactiveoutput
else
echo "${arr[@]:3}" >> $output
fi
;;
esac
done < <(cat "$file")
done
我期待着纽约州的帮助,感谢你在
用反斜杠将它转义出来,你知道'\ *',并测试它 –
所以如果我转义每个'*',那么在写入之前我必须替换每个'\ *'。这会大大增加运行时间。你有其他想法吗? – Vangorec
您是否尝试过在ls命令中使用反引号(')而不是使用$()表示法?所以看起来像data ='ls /scripts/s.iptables.d/iptables*' –