2012-04-12 146 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