Se corrige la expresión entera esperada cuando la variable puede estar vacía

Se corrige la expresión entera esperada cuando la variable puede estar vacía

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

información relacionada