2017-09-06 6 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 

ですNYの助けとls解析しないでください、事前

+0

バックスラッシュでそれをエスケープしてください。\\ '\ *'とテストしてください。 –

+0

だから、 '*'をエスケープすると、 '\ *'をすべて置き換えなければなりません。これは、実質的に実行時間を増加させる。あなたは他のアイデアを持っていますか? – Vangorec

+0

$()表記を使用する代わりに、lsコマンドの前後でバッククォート( ')を使用しようとしましたか?したがって、data = 'ls /scripts/s.iptables.d/iptables*'のようになります。 –

答えて

関連する問題