разделить на слова, разделенные точкой с запятой - PullRequest
2 голосов
/ 21 декабря 2011

У меня есть строка вроде

1; 2; 3; 4; 5

Я хочу иметь возможность перебирать эту строку, беря каждое слово одно за другим.Для первой итерации - 1, для следующей - 2, а для последней 5.

Я хочу получить что-то вроде этого

for i in $(myVar)
do
echo $i
done

, но я не знаю, как заполнить myvar

Ответы [ 4 ]

3 голосов
/ 21 декабря 2011

Нет необходимости создавать резервную копию переменной IFS, если вы назначаете ее только для одной команды:

$ IFS=';' read -a words <<<"1;2;3;4;5"
$ for word in "${words[@]}"
do
    echo "$word"
done
1
2
3
4
5

Другой полезный синтаксис:

$ echo "${words[0]}"
1
$ echo "${words[@]: -1}"
5
$ echo "${words[@]}"
1 2 3 4 5
2 голосов
/ 21 декабря 2011

Вероятно, самый простой способ сделать это - изменить переменную окружения IFS:

OLDIFS="$IFS"
IFS=';'
for num in $a; do echo $num; done

# prints:
1
2
3
4
5

IFS="$OLDIFS"

Не забудьте изменить ее позже, иначе произойдут странные вещи!:)

со страницы руководства bash:

   IFS    The Internal Field Separator that is  used  for  word  splitting
          after  expansion  and  to  split  lines into words with the read
          builtin  command.   The  default  value  is  ``<space><tab><new-
          line>''.
1 голос
/ 21 декабря 2011
echo '1;2;3;4;5' | tr \; \\n | while read line ; do echo $line; done
0 голосов
/ 21 декабря 2011

Это может работать для вас:

array=($(sed 'y/;/ /' <<<"1;2;3;4;5"))
for word in "${array[@]}"; do echo "$word"; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...