Страница 1 из 1

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

Добавлено: 12 май 2009, 17:11
SashaShveik

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

#!/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?

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

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

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

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

По идее после done следует поместить ";" и писать следующее echo в той же строке, или если не хочется в той же, то поместить символ слияния строк "\". Дело в том, что каждая строка скрипта выполняется в своей сессии и объявленная переменная не будет доступна в следующей строке.

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

Добавлено: 13 май 2009, 14:00
SashaShveik
  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