Estoy intentando crear nombres de archivos con un script bash, según el título, el año, la temporada y el número de episodio.
Sólo se puede garantizar que el título estará siempre presente, así que construí este código:
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
Esto funciona cuando la temporada o episodio no es nulo, pero cuando es nulo da un error integer expression expected
.
¿Cómo solucionar este error y mantener el objetivo de este código?
Ejemplo de resultados deseados:
A Title.file
A Title (2019).file
A Title - S01E20.file
A Title (2019) - S10E05.file
Respuesta1
Ya que estás usando bash, solo expresiones aritméticas:
season=null
if ((season < 1)); then echo covid19
elif ((season < 2)); then echo trump2020
else echo '???'
fi
covid19
Para su problema real, podría usar printf -v
(y probablemente haya muchas otras soluciones mejores):
>>> 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
Respuesta2
Su secuencia de comandos está intentando probar una cadena vacía con un número.
Puede evitar esto utilizando una expresión de valor predeterminado ( :-
) en la expansión de una variable que podría no estar configurada o establecerse en una cadena vacía.
Por ejemplo:
if [ ${season:-"0"} -gt 10 ]; then BLAH...; fi
Dado que también está probando la palabra, "null"
también puede establecer el valor predeterminado apropiado 0
cuando hay una coincidencia, en lugar de establecerlo en una cadena vacía.
Respuesta3
Está asignando un valor no numérico a season
:
if [ "$season" == "null" ]; then season=""; fi
por lo tanto, en el siguiente código, el valor puede ser una cadena vacía, de ahí el error.
Puedes controlar que la variable sea numérica, que será falsa si está vacía, antes de la comparación aritmética:
if [[ "$season" =~ ^[0-9]+$ && "$season" -gt 10 ]]; then
season=" - S$season"
elif [[ "$season" = "null" ]]; then
season=" - S0"
fi
Respuesta4
Combine sus declaraciones de temporada en una sola declaración. Luego repita para el episodio.
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