스크립트는 입력이 명령이라고 생각합니까?

스크립트는 입력이 명령이라고 생각합니까?

방금 기본 셸 명령을 실행하는 스크립트를 작성하기 시작했지만 두 번째 함수(유효한 연도와 월을 가져와 이를 cal에 삽입해야 함)가 다음 오류와 함께 반환됩니다.

Enter the year:
2014
/home/duncan/menuscript.sh: line 34: [2014: command not found
/home/duncan/menuscript.sh: line 34: [2014: command not found
This is an invalid year

이것이 제가 작업 중인 코드입니다. 답변을 찾았지만 왜 컴파일되지 않는지 모르겠습니다.. 날짜를 명령으로 입력하려는 것이 아닙니다!

#!/bin/bash
echo "Welcome to Duncan's main menu"
function press_enter
{
    echo ""
    echo -n "Press Enter to continue"
    read
    clear
}
year=
month=
selection=
until [ "$selection" = "9" ] 
do
  clear
  echo ""
  echo "    1 -- Display users currently logged in"
  echo "    2 -- Display a calendar for a specific month and year"
  echo "    3 -- Display the current directory path"
  echo "    4 -- Change directory"
  echo "    5 -- Long listing of visible files in the current directory"
  echo "    6 -- Display current time and date and calendar"
  echo "    7 -- Start the vi editor"
  echo "    8 -- Email a file to a user"
  echo "    9 -- Quit"
  echo ""
  echo "Make your selection:"
  read selection
  echo ""
  case $selection in
    1) who ; press_enter ;;
    2) echo "Enter the year:" ;
       read year ;
       if [$year>1] || [$year<9999]; then
         echo "Enter the month:" 
         read month
         if [0<$month<12]; then
           cal -d $year-$month 
           press_enter
         else
           echo "This is an invalid month"
           press_enter
         fi
       else
          echo "This is an invalid year"
          press_enter 
       fi ;;

    9) exit ;;
    *) echo "Please enter a valid option" ; press_enter ;;
   esac
done

답변1

이 줄에는 (일반적인) 구문 오류가 있습니다(글쎄, 둘 이상...).

[$year>1]
  1. [특수문자는 아니고 일반 명령어입니다. 따라서 줄의 나머지 부분은 매개변수이므로 공백으로 구분해야 합니다.[ "$year" > 1 ]

  2. 다음 문제는 이것이 >일반 매개변수가 아니라 리디렉션 문자(메타문자)라는 점입니다. 따라서 쉘은 (예를 들어) [2014해당 이름을 가진 명령을 보고 찾습니다. 쉘은 출력을 파일에 기록합니다(있는 경우 1]).

다음과 같이 사용하는 경우 [ ... ]연산자(보다 큼)가 필요합니다 -gt.

[ "$year" -gt 1 ]

bash또 다른 접근 방식은 예약어를 [[대신 사용하는 것입니다 [. 여전히 공백을 구분 기호로 사용해야 하지만 따옴표는 생략할 수 있습니다.

[[ $year -gt 1 ]]

또는 산술 표현식을 사용하여 정수를 비교할 수 있습니다.

((year > 1))

관련 정보