私はいくつかの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
解析しないでください、事前
バックスラッシュでそれをエスケープしてください。\\ '\ *'とテストしてください。 –
だから、 '*'をエスケープすると、 '\ *'をすべて置き換えなければなりません。これは、実質的に実行時間を増加させる。あなたは他のアイデアを持っていますか? – Vangorec
$()表記を使用する代わりに、lsコマンドの前後でバッククォート( ')を使用しようとしましたか?したがって、data = 'ls /scripts/s.iptables.d/iptables*'のようになります。 –