El script Bash para derivar n variables hasta que la variable de bucle basada en n iteraciones no funciona

El script Bash para derivar n variables hasta que la variable de bucle basada en n iteraciones no funciona

Tengo el siguiente problema en un script Bash:

Al ejecutar el script, se abre un cuadro emergente de Zenity para preguntar cuántas entradas de fecha deben ocurrir. Si, por ejemplo, se ingresa 3, se abren otras 3 casillas de Zenity (una tras otra) para solicitar una entrada de fecha.

A partir de esto puedo generar dos variables ( $tvary $date_entry_number). $date_entry_numbercaptura la cantidad de fechas ingresadas y $tvarcaptura todas las fechas ingresadas, separadas por espacios en blanco. En el caso de $date_entry_number= 3, $tvarpodría ser = '2020-07-02' '2020-07-03' '2020-07-04'.

Lo que estoy tratando de hacer es crear variables que contengan fechas individuales de $tvar, como una $tvar1='2020-07-02' $tvar2='2020-07-03' $tvar3='2020-07-04'base en $date_entry_numberla que podría haber cualquier número. Esto significaría que podría haber cualquier número de fechas en $tvar.

Mi opinión es que necesitaría un bucle for, como puede ver en el siguiente script, pero no estoy seguro de cómo hacerlo correctamente. ¿Puede ayudarme alguien, por favor?

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

Respuesta1

Es posible crear variables como tvar1pero bash tienematricesy ese es un mejor enfoque en general. A continuación se explica cómo crear una matriz tvarque contenga cada fecha como una entrada:

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

En lo anterior tvar=()se crea una matriz llamada tvar.

tvar+=(...)agrega lo que está en los pares al final de la matriz tvar. Usamos esto para agregar cada nueva fecha a medida que se ingresa.

Bash se expande ${!tvar[@]}para convertirse en una lista de la matrizíndices. si ies uníndiceen la matriz, como en el código anterior, podemos acceder al valor correspondiente si ${tvar[i]} queremos una lista de la matrizvalores, usaríamos${tvar[@]}

Para obtener más información sobre las potentes funciones de los arreglos bash, consulte la sección man bashtitulada Arrays.

información relacionada