Модифицировать IFS в bash при сборке и массиве - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь собрать массив из 4 различных массивов в bash с помощью пользовательского IFS, не могли бы вы мне помочь, пожалуйста.

#!/bin/bash   
arr1=(1 2 3 4)
arr2=(1 2 3 4)  
arr3=(1 2 3 4)  
arr4=(1 2 3 4)
arr5=()
oldIFS=$IFS
IFS=\;
for i in ${!arr1[@]}; do  
    arr5+=($(echo ${arr1[i]} ${arr2[i]} ${arr3[i]} ${arr4[i]}))
done
IFS=$oldIFS
echo ${arr5[@]}

i, какой будет вывод:

1 1 1 1;2 2 2 2;3 3 3 3;4 4 4 4 4 4

Но это не работает, вывод с нормальным ''.

1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 4 4

Есть идеи?

Я пробовал IFS в разных местах: 1) В цикле for 2) До arr5 ()

Я проверил это в цикле for и после IFS изменился на ";" но это не влияет на создание массива.

1 Ответ

0 голосов
/ 10 января 2019

IFS используется при расширении ${arr5[*]}, а не при создании arr5.

arr1=(1 2 3 4)
arr2=(1 2 3 4)  
arr3=(1 2 3 4)  
arr4=(1 2 3 4)
arr5=()
for i in ${!arr1[@]}; do  
    arr5+=("${arr1[i]}" "${arr2[i]}" "${arr3[i]}" "${arr4[i]}")
done
(IFS=";"; echo "${arr5[*]}")

Где возможно, проще просто изменить IFS в подоболочке, чем пытаться сохранить и восстановить его значение вручную. (Ваша попытка не удалась в том редком, но возможном случае, когда IFS был не задан с самого начала.)

Тем не менее, если вам нужна строка с ограничением ; и arr5 - это способ добраться до нее, просто создайте строку напрямую:

for i in ${!arr1[@]}; do
  s+="${arr1[i]} ${arr2[i]} ${arr3[i]} ${arr4[i]};"
done
s=${s%;}  # Remove the last extraneous semicolon
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...