Цикл по ассоциативным массивам подстрокой

Вам не нужен xterm, но Вам действительно нужен sqlite3. Это - Вы, работают

/usr/bin/xterm /home/ubuntu/test.sqlite .dump > …

когда действительно необходимо работать

/bin/sh -c "sqlite3 /home/ubuntu/test.sqlite .dump > …"

где я предполагаю, что Ваша база данных является …/test.sqlite. Я оставлю специфические особенности Java Вам.

2
29.01.2015, 16:34
3 ответа

Переменная косвенное пространство будет полезно здесь:

for journal in A B all
do
    indirect="${journal}_1999[@]"
    echo "$journal: ${!indirect}"
done

выходы

A: JF-1999 JFE-1999 RFS-1999
B: JBF-1999 JFI-1999 JMCB-1999
all: JF-1999 JFE-1999 RFS-1999 JBF-1999 JFI-1999 JMCB-1999

Rev-Free Rewrite. Массивы массивов - это не то, что Bash является втаконным, поэтому я должен использовать мезовые струны и хранение температуры

# Declare associative arrays of journal-year combinations
a_journal_list=( {JF,JFE,RFS} )
b_journal_list=( {JBF,JFI,JMCB} )
all_journal_list=( "${a_journal_list[@]}" "${b_journal_list[@]}" )
declare -a a b all

for year in {1998..2000} {2009..2011}
do
    # store year-specific values as space-separated strings
    a[$year]=$( printf "%s-$year " "${a_journal_list[@]}" )
    b[$year]=$( printf "%s-$year " "${b_journal_list[@]}" )
    all[$year]=$( printf "%s-$year " "${all_journal_list[@]}" )
done  

selected_years=( 1998 1999 2000 )
for journal in a b all
do
    # I'll use the positional params for temp storage of the accumulated array
    set --
    for year in "${selected_years[@]}"
    do
        indirect="${journal}[$year]"
        # variable is unquoted to allow word splitting
        set -- "$@" ${!indirect}
    done
    echo $journal
    printf "%s\n" "$@"
done
3
27.01.2020, 21:52

Я думаю, что есть некоторые неправильно понятые массивы Bash ':

массивы

  Bash предоставляют одномерные проиндексированные и ассоциативные переменные массива.  Любая переменная может использоваться в качестве
  индексированный массив;  Сборное объявление явно объявляет массив.  Там нет максимального предела на
  Размер массива, ни каких-либо требований, которые участники не будут проиндексированы или назначены непрерывно.  Проиндексированные массивы
  ссылаются с использованием целых чисел (включая арифметические выражения) и являются нулевыми;  ассоциативный
  Массивы ссылаются с использованием произвольных струн.  Если не указано иное, индексированные индексы массива должны быть
  неотрицательные целые числа.

  Индексированный массив создается автоматически, если какая-либо переменная назначается для использования имена синтаксиса [
  Script] = значение.  Индекс рассматривается как арифметическое выражение, которое необходимо оценить на номер.
  Явно объявляю индексированный массив, используйте Declare -a имя (см. Оболочку встроенные команды ниже).
  Объявление - имя [индекс] также принимается;  Индекс игнорируется.

  Ассоциативные массивы создаются с использованием Declare -a имя.

  Атрибуты могут быть указаны для переменной массива с использованием встроенных объявлений и готовности.  Каждый
  атрибут применяется ко всем членам массива.

  Массивы назначаются на использование составных заданий имени формы = (Value1 ... Valuen), где каждый
  Значение имеет форму [FOUNCSCRET] = строка.  Индексированные задания массива не требуют ничего, кроме строки.
  При назначении индексированных массивов, если прилагаются дополнительные кронштейны и индекс, этот индекс
  назначен;  В противном случае индекс назначенного элемента является последним индексом, назначенным утверждением
  плюс один.  Индексирование начинается с нуля.

  При назначении ассоциативного массива требуется индекс.

  Этот синтаксис также принимается встроенным встроенным.  Индивидуальные элементы массива могут быть назначены
  Использование имени [SOUNDCRUTS] = Синтаксис значения, представленного выше.  При назначении индексированного массива, если имя
  подписан отрицательным номером, этот номер интерпретируется как относительно один больше, чем
  Максимальный индекс имени, поэтому отрицательные индексы отсчитываются от конца массива, а индекс -1
  Ссылки на последний элемент.
 
0
27.01.2020, 21:52

Добро пожаловать в eval hell! Как только вы начнете использовать его, вы никогда от него не избавитесь.

for journal in A B all
do
  eval "echo \"\${${journal}_1999[@]}\""
done

Может быть, есть гораздо лучший способ сделать это, но я никогда не беспокоюсь об ассоциативных или иных вложенных массивах в скриптах оболочек. Если вам нужны такие структуры данных, возможно, вам лучше использовать скриптовый язык, который поддерживает их на родном языке.

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

4
27.01.2020, 21:52

Теги

Похожие вопросы