Skripterstellung für Verzeichnisse und Unterverzeichnisse basierend auf Benutzereingaben

Skripterstellung für Verzeichnisse und Unterverzeichnisse basierend auf Benutzereingaben

Hallo, ich bin nur ein Hobby-Neuling hier, also ist das hoffentlich keine zu einfache Frage.

Ich versuche, ein Skript zu schreiben, mit dem ich die gesamte Dateistruktur für meine Medien nur mit Benutzereingaben generieren kann. Bei mir funktioniert alles außer Zeile 20, wo sich „mkdir Season{1..$user_input4}“ befindet. Ich möchte, dass es die Benutzereingabe_4 nimmt und 1 + so viele Verzeichnisse erstellt, aber ich habe das Gefühl, dass ich das vielleicht aus der falschen Perspektive betrachte, da es stattdessen ein Unterverzeichnis mit dem Namen „Season{1..(druckt die Benutzereingabe)}“ erstellt.

#!/bin/bash
file_created="Directory Created"
directory_number=0
echo "How many directories should be created?"
read user_input
while [ $directory_number -ne $user_input ]
do 
    echo "Enter Directory Name"
    read user_input2 
        mkdir $user_input2
    directory_number=$((directory_number + 1))
echo "Do you want to create Seasons? Y/N"
    read user_input3
    if [ $user_input3 == "Y" ]
    then
        echo "Enter number of seasons"
            read user_input4
        cd $user_input2/
        mkdir Season{1..$user_input4}
        cd ..
    else
    :
    fi
done

Wenn jemand Ideen hat, wäre ich sehr dankbar. Danke!

Antwort1

So funktioniert es nicht, weil:

Die Reihenfolge der Erweiterungen ist:Klammererweiterung; Tilde-Erweiterung, Parameter undvariable Erweiterung, (…).
[man bash, Hervorhebung hinzugefügt]

Die Klammererweiterung erfolgt vor der Erweiterung der Variable und kann nur sehen {1..$user_input4}, was natürlich nicht gültig ist.

Ein weiteres mögliches Problem: Wenn $user_input4es sehr groß ist und Sie daher einesehr langListe der Verzeichnisnamen, die Sie überschreiten dürfenARG_MAXdie Grenze der Schale, wodurch der Befehl fehlschlägt. Sie können verwenden, sequm die Zahlenfolge zu erstellen, printfeine durch Nullen begrenzte Liste von Argumenten zu erstellen und so oft wie nötig xargsaufzurufen, mkdirum das zu umgehen. Natürlich ist es auch sicher, es mit einer kleineren Anzahl von Argumenten zu verwenden, also ist dies der richtige Weg, wenn Sie sowohl mit einer unbekannten Zahl als auch mit fiesen, bösartigen Benutzern zu tun haben:

printf 'Season%s\0' $(seq 1 $user_input4) | xargs -0 mkdir

Wenn die Zahlenfolge bei $user_input4+1 enden soll, ersetzen Sie die Variable einfach durch den arithmetischen Ausdruck $((user_input4 + 1)), zB:

printf 'Season%s\0' $(seq 1 $((user_input4 + 1))) | xargs -0 mkdir

Antwort2

Meines Wissens akzeptiert mkdir keine Verzeichnisbereiche, zumindest nicht in dem Format, in dem Sie es verwenden möchten. Sie erstellen die Jahreszeiten fast wie ein Array. Sie müssen sie jedoch einzeln mit Leerzeichen dazwischen übergeben, wenn Sie mit dem Befehl mkdir mehr als ein Verzeichnis erstellen möchten.

Da Sie in user_input4 einen numerischen Wert akzeptieren, könnten Sie versuchen, mithilfe einer While-Schleife vom Wert von user_input4 herunterzuzählen, bis Sie Null erreichen.

while [ $user_input4 -gt 0 ]
do
  mkdir Season${user_input4}
  let user_input4=${user_input4}-1
done

Die Schleife wird natürlich beendet, wenn user_input4 gleich Null ist. Oder wenn Sie eins mehr als die Zahl benötigen, verwenden Sie einfach -ge (größer oder gleich). Der einzige Haken bei dieser Methode ist, dass die Verzeichnisse in umgekehrter Reihenfolge erstellt werden. Wenn user_input4 also „3“ ist, wäre die Reihenfolge:

mkdir Season3
mkdir Season2
mkdir Season1

verwandte Informationen