Bash: Как из подоболочки достать содержимое массива

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
SashaShveik
Сообщения: 2
Зарегистрирован: 12 май 2009, 16:47

Код: Выделить всё

#!/bin/sh

declare -a keys # объявил массив

( sed -e 's/...//g' |      # выбираю из файла...
grep -v '...' |             # нужную мне информацию
awk '{print ($5, $6, $1)}' | sort -n | 
while read fkey lkey servname ; do
    index=0
    while [ "$index" -lt "${#keys[@]}" ] ; do
        keys[$index]="$lkey $servname" # каким-то образом заполняю данными массив
        let "index = $index + 1"
    done
    echo "${keys[@]}" # все элементы массива выводятся правильно
done
echo "${keys[@]}" # выводится пустая строка!!!
) < file
echo "${keys[@]}" # выводится пустая строка!!!
Как мне вытащить содержимое массива после внешнего цикла while-do-done?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Какой у тебя именно юниксоид и какой версии? У меня IBM AIX 6.1, на котором этот скрипт работать не хочет (например он не знает что такое declare).

Почему пишешь в теме bash, тогда как по первой строке скрипта видно, что у тебя запускается sh shell?

В общем, если на каком-то юниксоиде такой скрипт работает, то попытаюсь подсказать чисто интуитивно, без возможности проверить сказанное.

По идее после done следует поместить ";" и писать следующее echo в той же строке, или если не хочется в той же, то поместить символ слияния строк "\". Дело в том, что каждая строка скрипта выполняется в своей сессии и объявленная переменная не будет доступна в следующей строке.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
SashaShveik
Сообщения: 2
Зарегистрирован: 12 май 2009, 16:47

  1. debian (версия ядра: 2.6.26-1-amd64), bash 3.2.39(1).
  2. /bin/sh - это от старой версии скриптов осталось. на самом деле вызывается bash.
  3. declare - необязательно. этим я хотел показать, что такая ерунда даже если массив объявлять в главном скрипте (не в сабшелле). инструкция declare появилась в bash, начиная с версии 2.
  4. нет, такой вариант тоже ничего не выводит:

    Код: Выделить всё

    while ... ; do
       ...
       keys[0]="123"
       ...
    done ; echo "${keys[@]}" ; echo
    
Ответить