Есть ли способ разбить массив строк на несколько других массивов в Bash? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть массив my_array в Bash, который содержит строковые элементы, отформатированные таким образом:

my_array[0] = "username_1:id_1:name_1"
my_array[1] = "username_2:id_2:name_2"
my_array[2] = "username_3:id_3:name_3"

Мне было любопытно, есть ли удобный способ перебора этого массива, разбивая его на символ ":"и сохранение значений в три отдельных массива. Псевдокод может выглядеть примерно так:

index=0
for i in "${my_array}"
do
   usernames[$index], ids[$index], names[$index]= $(echo $i | tr ":" "\n")
   (( index = index + 1 ))
done

Этот вопрос ( Как разделить строку на разделителе в Bash? ) очень похож на то, что я пытаюсь выполнитьОднако я пытаюсь сохранить значения в трех разных массивах, что является моим главным препятствием. Заранее благодарен за любую помощь, поскольку я чрезвычайно новичок в программировании Bash.

вот что я пытался:


index=0
for i in "${arrayAdmin[@]}"
do
        credentials=$(echo $i | tr ":" "\n" )

        accounts[$index]=${credentials[0]}
        groups[$index]=${credentials[1]}
        names[$index]=${credentials[2]}
        (( index = $index + 1))
        echo $index
done

1 Ответ

1 голос
/ 31 октября 2019

Используйте read, затем присвойте каждому массиву индивидуально.

for i in "${my_array[@]}"
do
   IFS=: read -r username id name <<< "$i"
   usernames+=("$username")
   ids+=("$id")
   names+=("$name")
done

Вы можете написать

i=0
for rec in "${my_array[@]}"
do
    IFS=: read -r usernames[i] ids[i] names[i] <<< "$rec"
    ((i++))
done

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

Или, возможно, использование одной и той же индексной переменной (управляемой циклом for) как для входного массива, так и для трех выходных массивов.

for ((i=0;i < ${#my_array[@]}; i++)); do
    IFS=: read -r usernames[i] ids[i] names[i] <<< "${my_array[i]}"
done

И, наконец, если вы не хотите предполагать, что индексы массива являются непрерывной последовательностью, и вы хотите сохранить пробелы

# For example, my_array=([0]="..." [5]="..." [10]="...")
for i in "${!my_array[@]}"; do
    IFS=: read -r usernames[i] ids[i] names[i] <<< "${my_array[i]}"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...