Я пытаюсь преобразовать строку в массив и зациклить этот массив, чтобы передать каждое значение в качестве параметра команде 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.
Во-первых, необходимо удалить текст из всего присвоения строковой переменной:
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
Это повторит все объекты в Вашей начальной строке, гарантирует, что нет никакого пространства рядом с =
в 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'