
Ich habe folgendes Problem in einem Bash-Skript:
Bei der Ausführung des Skripts öffnet sich ein Zenity-Popup-Fenster, in dem gefragt wird, wie viele Datumseinträge erfolgen sollen. Wenn beispielsweise 3 eingegeben wird, werden weitere 3 Zenity-Fenster (nacheinander) geöffnet, in denen nach einem Datumseintrag gefragt wird.
Daraus kann ich zwei Variablen ( $tvar
und $date_entry_number
) generieren. $date_entry_number
Erfasst die Anzahl der eingegebenen Daten und $tvar
erfasst alle eingegebenen Daten, getrennt durch Leerzeichen. Im Fall von $date_entry_number
= 3 $tvar
könnte = sein '2020-07-02'
'2020-07-03'
'2020-07-04'
.
Ich versuche, Variablen zu erstellen, die einzelne Daten aus enthalten $tvar
, z. B. „ $tvar1='2020-07-02'
$tvar2='2020-07-03'
$tvar3='2020-07-04'
base“, auf $date_entry_number
der eine beliebige Zahl stehen könnte. Dies würde bedeuten, dass es eine beliebige Anzahl von Daten in geben könnte $tvar
.
Ich denke, ich bräuchte eine For-Schleife, wie Sie im Skript unten sehen können, aber ich bin nicht sicher, wie ich das richtig mache. Kann mir bitte jemand helfen?
#!/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}
Antwort1
Es ist möglich, Variablen wie zu erstellen, tvar1
aber Bash hatArraysund das ist insgesamt ein besserer Ansatz. So erstellen Sie ein Array tvar
, das jedes Datum als Eintrag enthält:
#!/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
Oben tvar=()
wird ein Array mit dem Namen erstellt tvar
.
tvar+=(...)
hängt den Inhalt der Klammern an das Ende des Arrays an tvar
. Wir verwenden dies, um jedes neue Datum beim Eingeben anzuhängen.
Bash wird ${!tvar[@]}
zu einer Liste des Arrays erweitertIndizesWenn i
ist einIndexim Array, wie im obigen Code, können wir auf den entsprechenden Wert zugreifen mit ${tvar[i]}
Es wollten wir eine Liste des ArraysWertewürden wir verwenden${tvar[@]}
Weitere Informationen zu den vielen leistungsstarken Funktionen von Bash-Arrays finden Sie im Abschnitt mit man bash
dem Titel Arrays
.