Скрипт Bash для получения n переменных из переменной цикла until на основе n итераций не работает

Скрипт Bash для получения n переменных из переменной цикла until на основе n итераций не работает

У меня возникла следующая проблема в скрипте Bash:

При выполнении скрипта открывается всплывающее окно Zenity с вопросом, сколько записей даты должно быть. Если, например, введено 3, то открываются еще 3 окна Zenity (одно за другим) с вопросом о вводе даты.

Из этого я могу сгенерировать две переменные ( $tvarи $date_entry_number). $date_entry_numberфиксирует количество введенных дат и $tvarфиксирует все введенные даты, разделенные пробелом. В случае $date_entry_number= 3, $tvarможет быть = '2020-07-02' '2020-07-03' '2020-07-04'.

Я пытаюсь создать переменные, содержащие отдельные даты из $tvar, например, $tvar1='2020-07-02' $tvar2='2020-07-03' $tvar3='2020-07-04'base, на $date_entry_numberкотором может быть любое число. Это означало бы, что в может быть любое количество дат $tvar.

Я думаю, что мне понадобится цикл for, как вы можете видеть в скрипте ниже, но я не уверен, как это правильно сделать. Может кто-нибудь помочь?

#!/bin/bash

date_entry_number="$(zenity --entry --text "ENTER number of date_entries:" --entry-text "1")"
        a=1 

tvar=$(until
        [[ $date_entry_number -lt $a ]]
do

date_out="$(zenity --calendar \
--title="Select a Date" \
--text="Click on a date to select that date." \
--date-format="'%G-%m-%d'")"

var="${date_out}"

echo $var

let a++

done)

echo $tvar
echo $date_entry_number

for i in {1..$date_entry_number}
do

        nvar{1..$tvar}

done

echo $nvar{1..$tvar}

решение1

Можно создавать переменные, как tvar1но в bash естьмассивыи это в целом лучший подход. Вот как создать массив tvar, содержащий каждую дату в качестве записи:

#!/bin/bash    
date_entry_number="$(zenity --entry --text "ENTER number of date_entries:" --entry-text "1")"

tvar=()
a=1
until [[ $date_entry_number -lt $a ]]
do
    tvar+=("$(zenity --calendar \
        --title="Select a Date" \
        --text="Click on a date to select that date." \
        --date-format="'%G-%m-%d'")")
    let a++
done

# Show what's in the array
declare -p tvar

# Loop through the indices of the array
for i in "${!tvar[@]}"
do
    echo "date $i = ${tvar[i]}"
done

В примере выше tvar=()создается массив с именем tvar.

tvar+=(...)добавляет то, что находится в скобках, в конец массива tvar. Мы используем это для добавления каждой новой даты по мере ее ввода.

Bash расширяется ${!tvar[@]}, чтобы стать списком массиваиндексы. Если iэтоиндексв массиве, как в коде выше, мы можем получить доступ к соответствующему значению с помощью ${tvar[i]} It нам нужен список массиваценности, мы бы использовали${tvar[@]}

Более подробную информацию о многочисленных мощных функциях массивов bash см. в man bashразделе Arrays.

Связанный контент