Существует хитрость для моделирования двумерных массивов с использованием ассоциативных массивов .Он работает хорошо, и я думаю, что он наиболее гибкий и расширяемый:
declare -A para
i=1
while IFS=, read -r -a line; do
for j in ${!line[@]}; do
para[$i,$j]="${line[$j]}"
done
((i++)) ||:
done < source_file
declare -p para
будет выводить:
declare -A para=([1,0]="usl-coop" [1,1]="/root" [2,1]="/bin" [2,0]="usl-dev" )
Без изменения вашего скрипта вы можете использовать расширение косвенной переменной .Иногда он используется в более простых сценариях:
i=1
while IFS="," read -r -a para_$i; do
n="para_$i[@]"
echo "${!n}"
((i++)) ||:
done < source_file
declare -p ${!para_*}
или в основном то же самое с nameref именованной ссылкой на другую переменную (примечание: посмотрите, как [@]
должен быть частью переменной при косвенном раскрытии, но не в именованной ссылке):
i=1
while IFS="," read -r -a para_$i; do
declare -n n
n="para_$i"
echo "${n[@]}"
((i++)) ||:
done < source_file
declare -p ${!para_*}
оба приведенных выше сценария будут выводить одинаково:
usl-coop /root
usl-dev /bin
declare -a para_1=([0]="usl-coop" [1]="/root")
declare -a para_2=([0]="usl-dev" [1]="/bin")
Тем не менее, я думаю, что выне должен читать ваш файл в память вообще.Это просто плохой дизайн.Оболочка и оболочка построены на передаче ваших файлов с конвейерами, потоками, fifo, перенаправлениями, подстановками процессов и т. Д. Без сохранения / копирования / сохранения файла.Если у вас есть файл для анализа, вы должны передать его другому процессу, проанализировать и сохранить результат, не сохраняя весь ввод в памяти.Если вы хотите, чтобы некоторые данные находились внутри файла, используйте grep
или awk
.