VoIPBL 更新スクリプトの一部を持っています。
cat /tmp/voipbl.txt | awk '{ print "if [ ! -z \""$1"\" -a \""$1"\" != \"#\" ]; then /usr/sbin/ipset -A voipbl_temp \""$1"\" ;fi;"}'
次のような行が作成されます。
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "1.2.3.4/32" ;fi; | sh
2 番目の部分はファイル (IP) から ipset に行を追加するものであることは理解していますが、テスト条件は何を行っているのでしょうか。-z と -a が同じ括弧内にある場合、それは何を意味するのでしょうか。また、「#」と等しくない部分は何を意味するのでしょうか。
答え1
おそらく/tmp/voipbl.txt
ファイルから IP を読み取り、それに基づいてシェル if 構造を作成します。awk$1
スクリプトのパラメータは各行の最初の列の項目を参照するため、1.2.3.4/32
各反復で の代わりに使用される文字列はその値になります。
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then
! -z "1.2.3.4/32"
- "1.2.3.4/32"
nullではないかどうかをチェックします。 -z
文字列がはゼロですが、はそれを否定します。これは、 nullでないかどうかをチェックするだけ!
のものに置き換えることができます。-n
"1.2.3.4/32" != "#"
- が"1.2.3.4/32"
等しくないことをチェックしていますが、#
これはファイル内に表示される可能性があるものだと思います。
演算子-a
はそしてつまり、文字列が null ではなく、かつ と等しくないことがチェックされます#
。
これらの条件が満たされると、以下が実行されます。
/usr/sbin/ipset -A voipbl_temp "1.2.3.4/32"
これをよりよく理解するには、次の内容のファイルに対して awk コマンドを実行してみてください。
1.2.3.4/32
# 3.4.5.6/32
そのファイルに対して awk コマンドを実行すると、次の結果が得られます。
$ awk '{ print "if [ ! -z \""$1"\" -a \""$1"\" != \"#\" ]; then /usr/sbin/ipset -A voipbl_temp \""$1"\" ;fi;"}' file
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "1.2.3.4/32" ;fi;
if [ ! -z "" -a "" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "" ;fi;
if [ ! -z "#" -a "#" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "#" ;fi;
テストでは、 が/usr/sbin/ipset
最初の行でのみ実行され、1.2.3.4/32
他の 2 行では が実行されないことが保証されます。