如何在shell脚本中分割空格前后的字符串?

如何在shell脚本中分割空格前后的字符串?

我有一个在 echo 上显示的变量,如下所示

$ echo $var
129 148

我必须只取 129 作为输出。我该如何拆分 129 和 148?

答案1

此外杰森乌赖恩的建议, 您可以使用cut

echo $var | cut -d' ' -f1

上面的cut输出echo带有空格分隔符 ( -d' ') 并输出第一个字段 ( -f1)

答案2

一个巧妙的方法是使用 bash 数组按空格分割字符串。您可以简单地使用括号声明一个数组:

var="129 148     181"
vars=( $var )
echo "First  word of var: '${vars[0]}'"
echo "Second word of var: '${vars[1]}'"
echo "Third  word of var: '${vars[2]}'"
echo "Number of words in var: '${#vars[@]}'"

答案3

长话短说

${var%% *}

$ echo "$var"
129 148
$ echo "${var%% *}"
129

评论

echo "${var% *}" && echo "${var#* }"... – 杰森·乌瑞安

虽然有无数种方法可以回答您的问题,但最简单的是参数扩展,这是 Jason 在评论中建议的。我相信这是解决这个问题的正确工具。

cut顺便说一句,这里的其他答案(管道到数组并拆分为数组)并没有错。它们是多功能的解决方案,当您遇到下一个问题时,可以更轻松地解决,“那么,我怎样才能得到第二个或第n个数字呢?”简单的问题很少能长期保持简单。

缺点

这种方法可能不是在所有地方都适用,尽管我很难找到一个不适用的地方。当然,它可以bash在大多数 Unix 机器上的默认交互式 shell 和zshMacOS 中的默认交互式 shell 中运行。即使是您在路由器上找到的有限 shell,例如我预计会破坏的ashdash,也可以与参数扩展一起正常工作。

${var%% *}关于对比的旁注${var% *}

你可能注意到我使用了两个百分号,而不是 Jason 建议的一个。区别在于%%删除了最长匹配字符串%最短的。例如,如果var包含三个数字,您会看到以下内容:

$ echo "$var"
129 148 167
$ echo "${var%% *}"
129
$ echo "${var% *}"
129 148

供进一步阅读

如果您已经做到了这一步,您可能想知道,“我在哪里可以了解有关参数扩展这个魔法的更多信息?”答案是,在您的 shell 文档中,例如man bash.这是有关部分的摘录参数扩展bash联机帮助页:

删除匹配的前缀模式。

${范围#单词}

${范围##单词}

单词 被扩展以产生一个模式,就像在路径名扩展中一样,并与扩展的值相匹配 范围 使用下面描述的规则 模式匹配。如果模式与值的开头匹配 范围,那么展开的结果就是展开后的值 范围 具有最短的匹配模式('#' 案例)或最长匹配模式('##' 案例)已删除。如果 范围@ 或者 *,模式移除操作依次应用于每个位置参数,扩展是结果列表。如果 范围 是一个数组变量,下标为 @ 或者 *,模式删除操作依次应用于数组的每个成员,扩展就是结果列表。

删除匹配的后缀模式。

${范围%单词}

${范围%%单词}

单词被扩展以产生一个模式,就像在路径名扩展中一样,并与扩展的值相匹配 范围 使用下面描述的规则 模式匹配。如果模式与扩展值的尾部部分匹配 范围,那么展开的结果就是展开后的值 范围 具有最短的匹配模式('%' 案例)或最长匹配模式('%%' 案例)已删除。如果 范围@ 或者 *,模式移除操作依次应用于每个位置参数,扩展是结果列表。如果 范围 是一个数组变量,下标为 @ 或者 *,模式删除操作依次应用于数组的每个成员,扩展就是结果列表。

答案4

您可以使用 set 命令将变量沿空格分割,如下所示:

IFS=" "
set -- $var
echo $1
129

相关内容