我有 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
我知道第二部分是將文件(IP)中的一行添加到 ipset,但是測試條件在做什麼?當 -z 和 -a 在同一組括號中時,這意味著什麼?不等於「#」部分是什麼意思?
答案1
它從/tmp/voipbl.txt
檔案中讀取大概的 IP,然後根據它們建立一個 shell。 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"
不為空。 -z
檢查字串是否是零,但!
否定了這一點。這可以而且可能應該被替換為-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
而不會在其他兩行上運行。