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

sur*_*bhi 43 shell string

我有一个像这样在 echo 上显示的变量

$ echo $var
129 148
Run Code Online (Sandbox Code Playgroud)

我只需要 129 作为输出。我将如何拆分 129 和 148?

Jos*_* R. 68

除了jasonwryan 的建议,您还可以使用cut:

echo $var | cut -d' ' -f1
Run Code Online (Sandbox Code Playgroud)

以上cutsecho输出带有空格分隔符 ( -d ' ') 并输出第一个字段 ( -f1)

  • @surbhi 什么说找不到命令?`cut` 是一个标准的工具。您的脚本可能在其他地方有错误。更一般地说,永远不要说“它不起作用”。始终准确说出您运行的代码、发生的情况以及复制粘贴错误消息。 (4认同)

gog*_*oud 22

一种巧妙的方法是使用 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[@]}'"
Run Code Online (Sandbox Code Playgroud)

  • 在 `zsh` 中不起作用;( (3认同)

hac*_*rb9 7

长话短说

\n

${var%% *}

\n
$ echo "$var"\n129 148\n$ echo "${var%% *}"\n129\n
Run Code Online (Sandbox Code Playgroud)\n

评论

\n
\n

echo "${var% *}" && echo "${var#* }"... \xe2\x80\x93 杰森乌瑞恩

\n
\n

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

\n

cut顺便说一句,这里的其他答案(管道到数组并拆分为数组)并没有错。它们是通用的解决方案,当您的下一个问题是\xe2\x80\x9c 那么,我如何获得第二个或第 n 个数字?\xe2\x80\x9d简单的问题很少会长期保持简单。

\n

缺点

\n

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

\n

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

\n

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

\n
$ echo "$var"\n129 148 167\n$ echo "${var%% *}"\n129\n$ echo "${var% *}"\n129 148\n
Run Code Online (Sandbox Code Playgroud)\n

供进一步阅读

\n

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

\n

删除匹配的前缀模式。

\n

${参数#字}

\n

${参数##单词}

\n

单词\ n扩展为产生与路径名\n扩展中的模式相同的模式,并使用\n模式匹配\n 下描述的规则与\n参数的扩展值进行匹配。\n如果模式与值的开头\n匹配的\n参数,\n则扩展的结果是\n参数的\n扩展值,具有最短匹配模式(\xe2\x80\x98 # \xe2\x80\x99 情况)或\n最长匹配模式( \xe2\x80\x98 ## \xe2\x80\x99 情况) 被删除。\n如果\n参数\nis\n @ \nor\n *,\n模式删除操作将依次应用于每个位置参数,\n扩展是结果列表。\n如果\n参数是一个下标为\n @或\n *的数组变量,\n模式删除操作将依次应用于\n数组的每个成员,并且扩展为结果列表。

\n

删除匹配的后缀模式。

\n

${参数%单词}

\n

${参数%%单词}

\n

该单词将被扩展以产生一个模式,\n就像在路径名扩展中一样,并使用\n模式匹配中描述的规则\n与参数\n的扩展值进行匹配。\n如果模式与\n扩展值的尾部部分匹配\n n参数,\n则扩展的结果是 \n参数的扩展值,\n具有最短匹配模式(\xe2\x80\x98 % \xe2\x80\x99 情况)或\n最长匹配模式(\n xe2\x80\x98 %% \xe2\x80\x99 case) 已删除。\n如果\n参数\nis\n @ \nor\n *,\n模式删除操作将依次应用于每个位置参数,并且扩展是结果列表。\n如果参数\n 是一个下标为\n @或\n *的数组变量,\n模式删除操作将依次应用于\n数组的每个成员,并且扩展是结果列表。

\n