在Bash中将以空格分隔的字符串读入数组中。
在Bash中将以空格分隔的字符串读入数组中。
我有一个包含以空格分隔的字符串的变量:
line="1 1.50 string"
我想通过使用空格作为分隔符来拆分该字符串,并将结果存储在一个数组中,以便以下的代码:
echo ${arr[0]} echo ${arr[1]} echo ${arr[2]}
输出
1 1.50 string
我在某处找到了一个不起作用的解决方案:
arr=$(echo ${line})
如果我在此之后运行上面的 echo 语句,我会得到:
1 1.50 string [空行] [空行]
我还尝试了
IFS=" " arr=$(echo ${line})
结果相同。可以有人帮忙吗?
在Bash中将一个以空格分隔的字符串转换为数组,有两种方法可以实现。
第一种方法是使用IFS
(内部字段分隔符)变量,该变量默认为空格字符,将字符串转换为数组。代码如下:
arr=($line)
需要注意的是,在这种方法中,$line
的引号是不能省略的,因为这样可以将字符串分割成多个元素。
第二种方法是使用herestring(<<<
)运算符,将字符串传递给read
命令的标准输入。代码如下:
read -a arr <<< "$line"
为了验证数组的正确性,可以使用以下代码进行检查:
for i in ${arr[@]}; do echo $i; done
或者只需使用echo ${arr[@]}
命令即可。
这两种方法在命令行中都可以正常工作。但是如果$line
中包含通配符字符,这两种方法可能会失败。例如:mkdir x && cd x && touch A B C && line="*" arr=($line); echo ${#arr[@]}
将输出3。
如果文件的分隔符是其他字符,例如:"1,1.50,string",可以尝试以下命令:arr=($(echo '1,1.50,string' | tr ',' ' '))
。
另外需要注意的是,在声明数组时,如果使用arr=("a b")
这样的语法是无法正常工作的,需要先声明一个中间变量line
,然后将其转换为数组:line="a b"
,然后arr=($line)
。
如果想避免通配符扩展,可以使用以下命令:set -f && arr=($line) && set +f
。
需要注意的是,line='*'
时,read -a arr <<<$line
始终有效,但是arr=($line)
会失败。
总结一下,通过以上两种方法,可以将以空格分隔的字符串转换为数组,但是需要注意特殊情况下的处理方式。
在Bash中将带空格分隔的字符串读入数组的过程中,出现了问题。这个问题的原因是,如果使用arr=($line)
这种方式来分割字符串,会导致通配符(*
、?
和[]
)被扩展为匹配的文件名,从而引起错误。为了解决这个问题,可以使用稍微复杂一些的方法:IFS=' ' read -a arr <<< "$line"
。在这种方式下,通配符不会被扩展,分割字符$IFS
被设置,并且变量被引用,从而解决了问题。这个方法更加可靠,应该被接受为正确的解决方案。在接受的答案中使用的arr=($line)
语句存在通配符扩展的问题。例如,尝试使用line="twinkling *"; arr=($line); declare -p arr
进行测试就会出现问题。对于herestring来说,引用是可选的,但为了一致性和可读性,最好还是使用双引号。此外,可以参考shellcheck
的文档中的建议,使用mapfile
或read -a
来进行可靠的分割。在测试中,还出现了func:read:5: bad option: -a
的错误提示,这可能是因为所使用的Bash版本不支持-a
选项。
在Bash中,有时我们需要将一个包含空格分隔的字符串读入数组中。下面是一个解决这个问题的方法:
arr=(`echo ${line}`);
这个方法在Z shell中也适用,而其他一些方法可能会失败。
有人问这个方法为什么有效,下面是解释:
这个方法使用了命令替换,即将命令的输出结果作为参数传递给数组。通过使用`echo`命令来输出`${line}`的值,并将结果作为参数传递给数组`arr`,从而将字符串按空格分隔存入数组中。
需要注意的是,如果字符串中包含`*`字符,这个方法也不起作用。例如,`line='*'`。
还有人在寻找一个适用于`GNU Make 4.2.1`的解决方法,但未能成功。
某些情况下使用`sh` shell,但这个shell不支持数组。除非你认为位置参数是`sh`中唯一的数组,那么可以使用以下方法:
set -- $line; printf '%s\n' "$@"
需要注意的是,在这种情况下,通配符字符仍然是一个问题。
总结一下,这个问题的解决方法是使用命令替换将空格分隔的字符串读入数组中。这种方法在Bash和Z shell中都适用,但不适用于包含通配符字符的字符串。