
У меня возникла следующая проблема в скрипте 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
.