我正在处理一个加载一些iptables列表的小脚本,并将每一行写入关联的链文件。 这仅在脚本在空目录中运行时才有效。 据我所知,这是由于我存储了值*的数组。只要调用带*的行,该值就会替换为当前目录中的所有文件。
您是否知道在非空文件夹中运行脚本的简单解决方案?
这是脚本在〜
中运行时的输出示例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 :(得分:1)
不要解析ls
- &gt; http://mywiki.wooledge.org/ParsingLs和http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29
做其中一项:
files=( /scripts/s.iptables.d/iptables* )
for file in "${files[@]}"
或只是
for file in /scripts/s.iptables.d/iptables*
同样done < <(cat "$file")
过度使用流程替换,只需使用
done < "$file"