如果指定字段不存在,cut 返回什么?

如果指定字段不存在,cut 返回什么?

我有一个字符串:

6.40.4

第二个:

6.40

我用来var=$(echo $versionfull | cut -d'.' -f3)从 bash 中的第一个字符串中获取第三个数字。此命令为第二个命令返回什么?它看起来是空的,但要么 要么[ -z $var ]不起作用[ $var == "" ]0如果有第二个字符串,我想给它一个值。

答案1

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

答案2

要回答您的直接问题,cut除了尾随换行符之外不返回任何内容,根据规格(谢谢唐克里斯斯蒂供参考):

echo "$versionfull" | cut -d. -f3 | od -c
0000000  \n
0000001

如果您有支持此处字符串的 shell,则可以执行以下操作:

IFS=. read a b c <<< "$versionfull"

请注意对 的引用$versionfull,以防它曾经有空格(来自 的任何内容$IFS)。

如果您认为该值c可能为空,请要求将其设置为零:

c=${c:-0}

答案3

你可以使用var=$(echo "${versionfull}.0" | cut -d'.' -f3).

在第一种情况下,versionfull将包含 6.40.4.0,忽略填充并根据需要返回 4。在第二种情况下,.0将被填充并返回。

答案4

它将其设置为空字符串。在命令中使用变量时应引用该变量[

if [ "$var" == "" ]
then echo "Var is empty"
fi

如果没有引号,第一行将扩展为:

if [ == "" ]

这是无效的语法,因为==需要在其左侧添加一个参数。

相关内容