bash,在其中使用带*的数组

时间:2017-09-06 10:41:05

标签: arrays bash

我正在处理一个加载一些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

我期待着任何帮助,并提前感谢您

1 个答案:

答案 0 :(得分:1)

不要解析ls - &gt; http://mywiki.wooledge.org/ParsingLshttp://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"