Как преобразовать строку в массив в скрипте bash?

Я пытаюсь преобразовать строку в массив и зациклить этот массив, чтобы передать каждое значение в качестве параметра команде bash. Я получаю сообщение о неправильной замене при выполнении сценариев.

text = 'xdc','cde','erd','ded','ded','kie';
OIFS=$IFS;
IFS=',';
ids=$($text);
for (i=0; i<${#ids[@]}; ++i);
do
echo "$i"
done
IFS=$OIFS

Этот сценарий, который я написал, также как передать значение индекса в качестве параметра команде внутри цикла for.

2
задан 12 August 2016 в 00:44

2 ответа

Во-первых, необходимо удалить текст из всего присвоения строковой переменной:

text="'xdc','cde','erd','ded','ded','kie';"

Затем можно просто использовать форму массива удара read команда:

IFS=, read -a ids <<< "${text%;}"

, куда ${text%;} замена удаляет запаздывающую точку с запятой. Обратите внимание, что, этот путь, IFS не изменяется за пределами эти read команда, таким образом, нет никакой потребности сохранить и восстановить его.


Ваш C-стиль синтаксис для цикла почти правилен, за исключением того, что в ударе, циклу нужны двойные круглые скобки, например,

for ((i=0; i<${#ids[@]}; ++i)); do printf '%s\n' "${ids[i]}"; done

, С другой стороны, можно циклично выполниться по участникам массива, непосредственно использующим for ... in цикл:

for i in "${ids[@]}"; do printf '%s\n' "$i"; done
0
ответ дан 12 August 2016 в 00:44

Это повторит все объекты в Вашей начальной строке, гарантирует, что нет никакого пространства рядом с = в text=, и используйте двойные кавычки вокруг строки. Также Вы используете ненужный ; с всюду по Вашему коду.

#!/bin/bash

text="'xdc','cde','erd','ded','ded','kie'"

IFS=',' read -ra ids <<< "$text"

for i in "${ids[@]}"
do
echo "$i"
done

Это произведет

'xdc'
'cde'
'erd'
'ded'
'ded'
'kie'
0
ответ дан 12 August 2016 в 00:44

Другие вопросы по тегам:

Похожие вопросы: