Ich versuche, mit einem Bash-Skript Dateinamen basierend auf Titel, Jahr, Staffel und Episodennummer zu erstellen.
Nur der Titel kann immer vorhanden sein, daher habe ich diesen Code erstellt:
title="A Title"
year=2019
source=null
resolution=null
season=null
episode=null
if [ "$year" == "null" ]; then year=""; else year=" ($year)"; fi
if [ "$source" == "null" ]; then source=""; fi
if [ "$season" == "null" ]; then season=""; fi
if [ "$season" -gt 10 ]; then season=" - S$season"; else season=" - S0$season"; fi
if [ "$episode" == "null" ]; then episode=""; fi
if [ "$episode" -gt 10 ]; then episode="E$episode"; else episode="E0$episode"; fi
touch "$title"${year:+"$year"}${season:+"$season"}${episode:+"$episode"}.file
Dies funktioniert, wenn Staffel oder Episode nicht null sind. Wenn sie jedoch null sind, tritt ein Fehler auf integer expression expected
.
Wie kann dieser Fehler behoben werden, ohne das Ziel dieses Codes zu verlieren?
Beispiel für gewünschte Ausgaben:
A Title.file
A Title (2019).file
A Title - S01E20.file
A Title (2019) - S10E05.file
Antwort1
Da Sie Bash verwenden, reichen nur arithmetische Ausdrücke:
season=null
if ((season < 1)); then echo covid19
elif ((season < 2)); then echo trump2020
else echo '???'
fi
covid19
Für Ihr eigentliches Problem könnten Sie Folgendes verwenden printf -v
(und es gibt wahrscheinlich viele andere, bessere Lösungen):
>>> cat ./script
#! /bin/bash
if ((year)); then printf -v year ' (%d)' "$year"; else year=; fi
if ((season)); then printf -v season ' - S%02d' "$season"; else season=; fi
if ((episode)); then printf -v episode 'E%02d' "$episode"; else episode=; fi
echo "$title$year$season$episode.file"
>>> export title='A Title'
>>> ./script
A Title.file
>>> year=2019 ./script
A Title (2019).file
>>> year=2019 season=3 ./script
A Title (2019) - S03.file
>>> year=2019 season=3 episode=9 ./script
A Title (2019) - S03E09.file
>>> year=2019 season=3 episode=11 ./script
A Title (2019) - S03E11.file
>>> season=3 episode=11 ./script
A title - S03E11.file
Antwort2
Ihr Skript versucht, eine leere Zeichenfolge mit einer Zahl zu vergleichen.
:-
Sie können dies vermeiden, indem Sie bei der Erweiterung einer Variablen, die möglicherweise nicht festgelegt oder auf eine leere Zeichenfolge festgelegt ist, einen Standardwertausdruck () verwenden .
Zum Beispiel:
if [ ${season:-"0"} -gt 10 ]; then BLAH...; fi
Da Sie auch auf das Wort testen, "null"
können Sie auch den entsprechenden Standardwert für 0
den Fall einer Übereinstimmung festlegen, anstatt ihn auf eine leere Zeichenfolge zu setzen.
Antwort3
Sie weisen einen nicht numerischen Wert zu season
:
if [ "$season" == "null" ]; then season=""; fi
Daher kann der Wert in Ihrem nächsten Code eine leere Zeichenfolge sein, daher der Fehler.
Sie können vor dem arithmetischen Vergleich kontrollieren, ob die Variable numerisch ist. Wenn sie leer ist, ergibt sie „false“:
if [[ "$season" =~ ^[0-9]+$ && "$season" -gt 10 ]]; then
season=" - S$season"
elif [[ "$season" = "null" ]]; then
season=" - S0"
fi
Antwort4
Kombinieren Sie die if-Anweisungen Ihrer Staffel zu einer einzigen Anweisung. Wiederholen Sie dies dann für die Episode.
if [ "$season" == "null" ]; then
# you could also perform some other assignment here
season="";
elif [ "$season" -gt 10 ]; then
season=" - S$season";
else
season=" - S0$season";
fi