如何从Bash列表中获取第一个字符串?

8
我有一个 Bash 列表(由空格分隔的字符串),我只想从中提取第一个字符串。
例如:
 VAR="aaa bbb ccc" -> I need "aaa"
 VAR="xxx" -> I need "xxx"

有没有除了使用带有“break”的“for”以外的其他技巧?

可能的规范问题(3年前,13个答案和135个赞):如何在Bash中检索命令输出的第一个单词? - Peter Mortensen
5个回答

11

使用cut命令:

echo $VAR | cut --delimiter " " --fields 1  # Number after fields is the 
                                            # index of pattern you are retrieving

在某些 Linux 版本中,可以使用以下命令:echo $VAR | cut -d " " -f 1 - blissweb

7
尝试使用这种格式:
echo "${VAR%% *}"

另一种方式是:
read FIRST __ <<< "$VAR"
echo "$FIRST"

2
你想使用 ## 吗?难道不应该是 %% 吗? - IanM_Matrix1
这个(参数扩展)是最干净的解决方案。当然,除了一开始使用数组。 - Adrian Frühwirth

7
如果你需要使用数组,那么请使用数组。 ;)
VAR=(aaa bbb ccc)
echo ${VAR[0]} # -> aaa
echo ${VAR[1]} # -> bbb

1
他要求一个“以空格分隔的字符串”。 - WPWoodJr
1
将第一行替换为 VAR2="aaa bbb ccc"VAR=($VAR2) 将起作用。 - Peter Mortensen
echo ${VAR[0]} 可以简化为 echo ${VAR} 或者 echo $VAR - Peter Mortensen
通常情况下,如果例如“aaa”被替换为“*”(一个星号),它将失败。它会扩展到当前目录中的所有文件和所有目录的列表... - Peter Mortensen

6

我不确定这是否是标准的做法,但此方法适用于Bash 4.1.11版本。

NewVAR=($VAR)
echo $NewVAR

确实可以工作。而且它要简单得多(尤其是与调用外部进程如cutAWKPerl相比,速度更快)。 - Peter Mortensen
但是如果第一个“单词”是“*”(一个星号),它将失败 - 它会扩展到当前目录中的所有文件和所有目录的列表... - Peter Mortensen

2

目前在Linux和OS X上都可行的唯一解决方案是:

 IP="1 2 3"
 for IP in $IP:
 do
   break
 done

刚刚检查了一下在Mac OS中是否有cut命令,找到了这个链接:http://stackoverflow.com/questions/1211943/extract-text-from-hostname - Juto
“cut” 存在,但并不相同,实际上是相当古老的一个。 - sorin
我不确定你所说的“相当古老”的是什么意思,它还能用吗?我想,如果它能用,像cut这样的程序就不需要每个月更新了吧? - Juto
太老了,已经没有你使用的参数了 :p - sorin
echo $VAR | cut -d " " -f 1 (适用于OSX) - blissweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接