방금 기본 셸 명령을 실행하는 스크립트를 작성하기 시작했지만 두 번째 함수(유효한 연도와 월을 가져와 이를 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]
[
특수문자는 아니고 일반 명령어입니다. 따라서 줄의 나머지 부분은 매개변수이므로 공백으로 구분해야 합니다.[ "$year" > 1 ]
다음 문제는 이것이
>
일반 매개변수가 아니라 리디렉션 문자(메타문자)라는 점입니다. 따라서 쉘은 (예를 들어)[2014
해당 이름을 가진 명령을 보고 찾습니다. 쉘은 출력을 파일에 기록합니다(있는 경우1]
).
다음과 같이 사용하는 경우 [ ... ]
연산자(보다 큼)가 필요합니다 -gt
.
[ "$year" -gt 1 ]
bash
또 다른 접근 방식은 예약어를 [[
대신 사용하는 것입니다 [
. 여전히 공백을 구분 기호로 사용해야 하지만 따옴표는 생략할 수 있습니다.
[[ $year -gt 1 ]]
또는 산술 표현식을 사용하여 정수를 비교할 수 있습니다.
((year > 1))