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_input4
es sehr groß ist und Sie daher einesehr langListe der Verzeichnisnamen, die Sie überschreiten dürfenARG_MAX
die Grenze der Schale, wodurch der Befehl fehlschlägt. Sie können verwenden, seq
um die Zahlenfolge zu erstellen, printf
eine durch Nullen begrenzte Liste von Argumenten zu erstellen und so oft wie nötig xargs
aufzurufen, mkdir
um 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