2012-04-12 212 views

回答

14
str=a:b:c:d:e 
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" 

这仅适用于读命令的持续时间限制变化的IFS变量。

+1

它不工作。错误消息说预计“(”在它是ary的行=($ str)。 – 2012-04-12 19:51:06

+1

这是特别的bash语法。你在用什么shell?如果脚本有'#!/ bin/sh'变成'#!/bin/bash' – 2012-04-12 20:12:07

+0

我改变了这个,但是错误信息没有消失 – 2012-04-12 20:52:15

6

实测值,不需要改变IFS或回路中的溶液:

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

输出:

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

这是行不通的...尝试做一个回声$ {arr [1]} – mhstnsc 2016-07-05 15:01:24

15
#!/bin/bash 

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

OUTPUT:

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

结合的答案上面的东西,工作f或者我

set -- `echo $PATH|cut -d':' --output-delimiter=" " -f 1-`; for i in "[email protected]"; do echo $i; done 

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

对测试字符串使用$ PATH是一个很好的接触,但:方式太复杂了,这与[zzk's回答(https://stackoverflow.com/a/13784224/3789665)? – greybeard 2017-07-09 15:20:27

+0

@greybeard tl; dr它没有:) - 我发现zzk的答案对我来说并不是很有用,所以通过'set --'调整它,然后从给出的多个答案中整理出有用的东西。这是为了我自己的目的,但也分享回来,如果其他人有同样的问题 – 2017-07-09 22:03:36

+0

FWIW我需要对路径中列出的所有文件夹运行多个测试 - 主要是审计特权升级问题。 – 2017-07-09 22:10:07