Korrigieren Sie den erwarteten ganzzahligen Ausdruck, wenn die Variable leer sein kann

Korrigieren Sie den erwarteten ganzzahligen Ausdruck, wenn die Variable leer sein kann

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 0den 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

verwandte Informationen