Awk
如果值為 0(數字零),為什麼 awk 對於 $1 的行為會有所不同?
當 awk 接收**“0”**作為輸入時,它在某些情況下的行為會有所不同。下面的程式碼:
var=$1 echo ""; echo -n 'o/p of $1=$1 ==>'; echo $var | awk '$1=$1' echo "";echo -n 'o/p of {$1=$1;print} ==>';echo $var | awk '{$1=$1;print}' echo "";echo -n 'o/p of $1==$1 ==>';echo $var | awk '$1==$1' echo "";echo -n 'o/p of {$1==$1;print} ==>';echo $var | awk '{$1==$1;print}'
帶有**“0”(數字零)**的輸出:
[root@host ~]# sh /tmp/te.sh 0 o/p of $1=$1 ==> o/p of {$1=$1;print} ==>0 o/p of $1==$1 ==>0 o/p of {$1==$1;print} ==>0 [root@GORJALA ~]#
帶有**“1”(第一)**的輸出:
[root@host ~]# sh /tmp/te.sh 1 o/p of $1=$1 ==>1 o/p of {$1=$1;print} ==>1 o/p of $1==$1 ==>1 o/p of {$1==$1;print} ==>1 [root@host ~]#
var=0; echo $var | awk '$1=$1'
為什麼我使用and時會有區別var=1; echo $var | awk '$1=$1'
?除了 之外,所有數字都工作正常0
。版本:
- GNU bash,版本 4.2.46
- GNU awk 4.0.2
- coreutils-8.22-24.el7.x86_64
賦值是一個表達式,所以它有一個值——與賦值相同的值。因此,‘z = 1’ 是一個值為 1 的表達式。
所以
echo 0 | awk '$1=$1'
模式評估為 0 (FALSE)echo 1 | awk '$1=$1'
模式評估為 1 (TRUE) 並
我不認為這與數值有關:標準轉換會解決這個問題(至少在這裡)。
OP 顯示了四種不同的 awk 程式碼,所有變體:pattern { action }
(一種) $ 1 = $ 1
重新分配 $ 1 to itself. It is not a boolean test, it is a no-op (effectively), and it returns the value of $ 1. 如果 $1 為 0,則模式為假,****完全跳過預設列印動作。如果 $1 不為零,則列印輸入。
(b) { $ 1 = $ 1個;列印; }
這將 $1 重新分配給自身,也是無操作。在沒有模式的情況下,將執行操作並始終列印輸入。
(C) $ 1 == $ 1
這是一個始終為真的布爾表達式。0 是 0,1 是 1(土豚是土豚)。在沒有動作的情況下,輸入總是被列印。
(d) { $ 1 == $ 1個;列印; }
沒有模式。比較評估為被丟棄的真正布爾值。輸入總是列印出來的。