2017-09-06 75 views
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 

我期待着纽约州的帮助,感谢你在

+0

用反斜杠将它转义出来,你知道'\ *',并测试它 –

+0

所以如果我转义每个'*',那么在写入之前我必须替换每个'\ *'。这会大大增加运行时间。你有其他想法吗? – Vangorec

+0

您是否尝试过在ls命令中使用反引号(')而不是使用$()表示法?所以看起来像data ='ls /scripts/s.iptables.d/iptables*' –

回答