将字符串拆分为数组Shell脚本

23

如何在shell脚本中将字符串拆分为数组?

我尝试使用 IFS='delimiter' 并在循环结构 (for, while) 中操作,虽然成功了,但我需要从该字符串创建一个数组。

请问如何将字符串转换成数组?

谢谢!

4个回答

34
str=a:b:c:d:e
set -f
IFS=:
ary=($str)
for key in "${!ary[@]}"; do echo "$key ${ary[$key]}"; done

输出

0 a
1 b
2 c
3 d
4 e

另一种(bash)技术:

str=a:b:c:d:e
IFS=: read -ra ary <<<"$str"

这将仅在 read 命令运行期间限制对 IFS 变量的更改。


2
它不起作用。错误消息显示在ary=($str)这一行中期望有"("。 - Gábor Varga
1
这是特定的bash语法。你使用的是哪个shell?如果你的脚本有#!/bin/sh,请改为#!/bin/bash - glenn jackman
1
@SJunejo,/bin/sh中唯一类似数组的数据结构是位置参数:set -- $str; for element in "$@"; do echo $element; done。如果你确实需要一个数组,那么你需要选择一个不同的工具来完成任务。 - glenn jackman
无法运行 --> 3:backup.sh:语法错误:“(”意外 - mat
数组是Bash的一个特性。如果你想使用数组,就不能使用sh。如果你已经阅读了其他评论,应该已经意识到这一点了。 - glenn jackman
显示剩余5条评论

28
#!/bin/bash

str=a:b:c:d:e
arr=(${str//:/ })

输出:

echo ${arr[@]}
a b c d e

8

我找到了一种解决方案,不需要更改IFS或循环:

str=a:b:c:d:e
arr=(`echo $str | cut -d ":"  --output-delimiter=" " -f 1-`)

输出:

echo ${arr[@]}
a b c d e

对于ELEMENT在$(echo 'a,b,c' | cut -d ',' --output-delimiter=' ' -f 1-)中
执行
echo "$ELEMENT"
完成
- Louis Huang

3
将上述答案结合起来,对我有用的内容如下:
set -- `echo $PATH|cut -d':' --output-delimiter=" " -f 1-`; for i in "$@"; do echo $i; done

提供

# set -- `echo $PATH|cut -d':' --output-delimiter=" " -f 1-`; for i in "$@"; do echo $i; done
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
# 

使用$PATH作为测试字符串是一个不错的点子,但是:太过复杂了,而且这与zzk的回答有什么不同呢?(链接:https://dev59.com/I2kw5IYBdhLWcg3wHW3n#13784224) - greybeard
@老程序员 简而言之,它不起作用 :) - 我发现zzk的答案对我来说不太适用,所以通过set--进行了调整,并从多个答案中整理出有用的内容。这是为了我的自身目的,但如果其他人遇到同样的问题,也可以分享回去。 - Richard Braganza
就我个人而言,我需要对路径中列出的所有文件夹运行多个测试,主要是为了审计特权升级问题。 - Richard Braganza

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