Corrija a expressão inteira esperada quando a variável pode estar vazia

Corrija a expressão inteira esperada quando a variável pode estar vazia

Estou tentando criar nomes de arquivos com um script bash, baseado no título, ano, temporada e número do episódio.

Somente o título pode ter certeza de estar sempre presente, então 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

Isso funciona quando a temporada ou episódio não é nulo, mas quando é nulo dá um erro integer expression expected.

Como corrigir esse erro e manter o objetivo deste código?

Exemplo de saídas desejadas:

A Title.file
A Title (2019).file
A Title - S01E20.file
A Title (2019) - S10E05.file

Responder1

Como você está usando o bash, apenas expressões aritméticas:

season=null
if ((season < 1)); then echo covid19
elif ((season < 2)); then echo trump2020
else echo '???'
fi

covid19

Para o seu problema real, você poderia usar printf -v(e provavelmente existem muitas outras soluções melhores):

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

Responder2

Seu script está tentando testar uma string vazia em relação a um número.

Você pode evitar isso usando uma expressão de valor padrão ( :-) na expansão de uma variável que pode não estar definida ou definida como uma string vazia.

Por exemplo:

if [ ${season:-"0"} -gt 10 ]; then BLAH...; fi

Como você também está testando a palavra, "null"também pode definir o valor padrão apropriado de 0quando há uma correspondência, em vez de defini-lo como uma string vazia.

Responder3

Você está atribuindo um valor não numérico a season:

if [ "$season" == "null" ]; then season=""; fi

portanto, em seu próximo código, o valor pode ser uma string vazia, daí o erro.

Você pode controlar se a variável é numérica, que será falsa se vazia, antes da comparação aritmética:

if [[ "$season" =~ ^[0-9]+$ && "$season" -gt 10 ]]; then
  season=" - S$season"
elif [[ "$season" = "null" ]]; then
  season=" - S0"
fi

Responder4

Combine suas declarações if da temporada em uma única declaração. Em seguida, repita para o episódio.

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

informação relacionada