Text-Processing

如果指定的欄位不存在,cut 會返回什麼?

  • January 24, 2022

我有一個字元串:

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)。

引用自:https://unix.stackexchange.com/questions/465583