我有一个在 echo 上显示的变量,如下所示
$ echo $var
129 148
我必须只取 129 作为输出。我该如何拆分 129 和 148?
答案1
答案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 和zsh
MacOS 中的默认交互式 shell 中运行。即使是您在路由器上找到的有限 shell,例如我预计会破坏的ash
和dash
,也可以与参数扩展一起正常工作。
${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