Bash-Skript zum Ableiten von n Variablen aus der Until-Schleifenvariable basierend auf n Iterationen funktioniert nicht

Bash-Skript zum Ableiten von n Variablen aus der Until-Schleifenvariable basierend auf n Iterationen funktioniert nicht

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 ( $tvarund $date_entry_number) generieren. $date_entry_numberErfasst die Anzahl der eingegebenen Daten und $tvarerfasst alle eingegebenen Daten, getrennt durch Leerzeichen. Im Fall von $date_entry_number= 3 $tvarkö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_numberder 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, tvar1aber 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 iist 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 bashdem Titel Arrays.

verwandte Informationen