Bash:将字符串转换为数组?

Bash:将字符串转换为数组?

我一直在谷歌搜索但没有结果,所以我将非常感谢有人能提供帮助。

我有一串将要生成的文件名,每个文件名由字符 分隔|

例如,文件名字符串类似于:

/home/user/something or other.txt|/home/user/Downloads/something else.txt|/home/somewhere/there are spaces definitely.txt|/home/user/there are always spaces.txt|/home/user/Documents/spaces are always present.txt

我想将这个字符串拆分成一个数组,使用字符|来拆分文件名及其位置。

我尝试过这个:

IFS='|' read -ra array <<< "$string"

但它不起作用并给了我以下错误信息:

Syntax error: redirection unexpected

也许有人比我聪明得多,有解决方案吗?我将不胜感激!

答案1

您的代码是正确的 -对于 bash

我在 .sh 文件顶部有 #!/bin/bash

好的

然后我运行 sh filename.sh 来运行它。

问题就在这里 - 你明确地告诉系统忽略shebang,并使用 运行脚本sh。这很可能解决了Ubuntu 上默认的/bin/shPOSIX shell 是什么。dash

相反,只需让你的脚本可执行

chmod +x filename.sh

然后使用运行它

./filename.sh

这将确保使用正确的解释器。另请参阅

答案2

使用 mapfile 将字符串读入具有用户定义分隔符的索引数组:

$ string='1|2|3|4'; \
  mapfile -td \| <<< $string; echo ${MAPFILE[@]}

相关内容