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

другой (Баш) технике:

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

Это ограничивает изменение переменной IFS только на время выполнения команды чтения.

+1

Это не работает. Сообщение об ошибке означает «ожидаемое» («в строке, где это ary = ($ str)). –

+1

Это, в частности, синтаксис bash. Какую оболочку вы используете? Если у вас есть сценарий' #!/Bin/sh', измените на '#!/bin/bash' –

+0

Я изменил это, но сообщение об ошибке не истечет. –

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

15
#!/bin/bash 

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

ВЫХОД:

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

+0

@greybeard tl; dr Это не так :) - Я обнаружил, что ответ zzk не совсем сработал для меня, поэтому настроил его на 'set --', а затем сопоставил полезный материал из нескольких приведенных ответов. Это было для моих собственных целей, но и поделиться им, если у других была такая же проблема. –

+0

FWIW Мне нужно было выполнить несколько тестов против всех папок, перечисленных в пути - в основном для аудита по вопросам эскалации привилегий. –

Смежные вопросы