@Iskatel_S

Как присвоить значение элемента строкового массива в bash?

Вопрос такой, в bash строковые массивы ведь есть, присвоить элемент массива через array["$i"]= ведь можно. Вот например я делаю так, чтобы строки из файла array.list записывались в строковый массив array, а потом выводились... и не работает. Где ошибка?
#!/bin/bash

i=1
cat array.list | while read str
do
   array["$i"]="$str"
   i=$(($i+1))
done
echo ${array[@]}
  • Вопрос задан
  • 52 просмотра
Пригласить эксперта
Ответы на вопрос 3
gdt
@gdt
Программист
Что ж, я выполнил за вас поиск в гугле:
bash set array element
Пользуйтесь на здоровье:


Я ненастоящий сварщик, но рискну предположить, что добавление строки по типу
declare -a array
перед циклом может чем-то помочь.
Ответ написан
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
В вашем случае cat array | while запускает весь блок while в отдельном шелл процессе, и естественно результат в родительский процесс не вернется, умерев вместе с завершением цикла и дочерним процессом.
Делай так:
#!/bin/bash

i=1
while read str
do
   array["$i"]="$str"
   i=$(($i+1))
done <array.list 
echo ${array[@]}
Ответ написан
xotkot
@xotkot
хорошо есть и хорошо весьма
можно загнать строки из файла в массив намного проще:
x="$IFS";IFS=$'\n';array=(`cat array.list`);IFS="$x"


если брать конкретно ваш вариант то можно использовать опцию lastpipe чтобы выполнить последнюю команду конвейера в текущей оболочке:
i=1
shopt -s lastpipe
cat array.list | while read str
do
   array["$i"]="$str"
   i=$(($i+1))
done
shopt -u lastpipe
echo ${array[@]}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы