Я пытаюсь создать имена файлов с помощью скрипта bash на основе названия, года, сезона и номера эпизода.
Только заголовок может быть гарантированно всегда представлен, поэтому я создал следующий код:
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
Это работает, когда сезон или эпизод не равен нулю, но если он равен нулю, возникает ошибка integer expression expected
.
Как исправить эту ошибку и сохранить цель этого кода?
Пример желаемых результатов:
A Title.file
A Title (2019).file
A Title - S01E20.file
A Title (2019) - S10E05.file
решение1
Поскольку вы используете bash, просто арифметические выражения:
season=null
if ((season < 1)); then echo covid19
elif ((season < 2)); then echo trump2020
else echo '???'
fi
covid19
Для решения вашей реальной проблемы вы можете использовать printf -v
(и, вероятно, есть много других, лучших решений):
>>> 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
решение2
Ваш скрипт пытается сравнить пустую строку с числом.
Этого можно избежать, используя выражение значения по умолчанию ( :-
) в расширении переменной, которая может быть не установлена или установлена в пустую строку.
Например:
if [ ${season:-"0"} -gt 10 ]; then BLAH...; fi
Поскольку вы также проверяете слово, "null"
вы также можете установить соответствующее значение по умолчанию 0
при наличии совпадения, вместо того чтобы устанавливать его в пустую строку.
решение3
Вы присваиваете нечисловое значение season
:
if [ "$season" == "null" ]; then season=""; fi
поэтому в вашем следующем коде значение может быть пустой строкой, отсюда и ошибка.
Вы можете контролировать, является ли переменная числовой, которая будет иметь значение false, если она пуста, перед арифметическим сравнением:
if [[ "$season" =~ ^[0-9]+$ && "$season" -gt 10 ]]; then
season=" - S$season"
elif [[ "$season" = "null" ]]; then
season=" - S0"
fi
решение4
Объедините ваши сезонные if-высказывания в одно высказывание. Затем повторите для эпизода.
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