如果指定的欄位不存在,cut 會返回什麼?
我有一個字元串:
6.40.4
第二個:
6.40
我
var=$(echo $versionfull | cut -d'.' -f3)
用來從 bash 中的第一個字元串中獲取第三個數字。此命令為第二個返回什麼?它看起來是空的,但要麼要麼[ -z $var ]
不起作用[ $var == "" ]
。如果是第二個字元串,我想給它一個值0
。
要回答您的直接問題,根據規範
cut
,除了尾隨換行符之外什麼都不返回(感謝don_crissti提供的參考):echo "$versionfull" | cut -d. -f3 | od -c 0000000 \n 0000001
如果你有一個支持 here-strings 的 shell,你可以執行以下操作:
IFS=. read a b c <<< "$versionfull"
注意 的引用
$versionfull
,以防它有空格(來自 的任何內容$IFS
)。如果您認為這
c
可能是空的,請要求將其設置為零:c=${c:-0}
cut
有一個奇怪的 API。
cut -f n
將輸出具有至少一個分隔符的每行的第 n個欄位(如果該行的分隔符少於 n-1 個(少於 n 個欄位),則為空),並為那些沒有的行返回整行(即第一個欄位) ‘沒有任何分隔符:$ echo a.b.c | cut -d. -f3 c $ echo a.b | cut -d. -f3 $ echo a | cut -d. -f3 a
那麼如果指定的欄位不存在,cut 會返回什麼的答案呢?是第一個欄位還是空欄位,具體取決於輸入行是否有一個欄位或多個欄位。
您可以添加
-s
選項以刪除沒有任何分隔符的行,以避免上述奇怪的最後一種情況,但這通常不是您想要的(您通常希望該輸入行有一個空的第三個欄位完全跳過它),如果你想要第一個欄位,那就更糟了:$ echo a | cut -sd. -f2 $ echo a | cut -sd. -f1 $
(您要求第一個欄位,輸入只有一個欄位,但您沒有得到任何輸出,因為輸入沒有分隔符)。
所以@ThoriumBR 的添加 a 的建議
.0
非常好。沒有它:versionfull=5 echo "$versionfull" | cut -d. -f3
實際上會輸出 5。通過添加
.0
,我們確保輸入至少有一個分隔符。我會更進一步並使用:echo "$versionfull.0.0" | cut -d. -f3
確保輸入至少有 3 個欄位(這裡假設
$versionfull
它本身不包含換行符或反斜杠字元,因為它會cut
剪切其輸入的每一行;並\n
通過 的許多實現轉換為換行符echo
)。