
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 ( $tvar
y $date_entry_number
). $date_entry_number
captura la cantidad de fechas ingresadas y $tvar
captura todas las fechas ingresadas, separadas por espacios en blanco. En el caso de $date_entry_number
= 3, $tvar
podrí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_number
la 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 tvar1
pero bash tienematricesy ese es un mejor enfoque en general. A continuación se explica cómo crear una matriz tvar
que 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 i
es 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 bash
titulada Arrays
.