변수가 비어 있을 수 있을 때 예상되는 정수 표현식 수정

변수가 비어 있을 수 있을 때 예상되는 정수 표현식 수정

제목, 연도, 시즌 및 에피소드 번호를 기반으로 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

이는 시즌이나 에피소드가 null이 아닌 경우 작동하지만, null인 경우 오류가 발생합니다 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

관련 정보