일년 중 처음 이틀에 스크립트가 실행될 때 아래 스크립트를 사용하여 이틀 뒤로 이동하고 매월 첫째 날과 둘째 날을 확인하여 이틀 뒤로 이동합니다.
if [$month="01"] && [$day="01"]; then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [$month="01"] && [$day="02"]; then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [ $day = "01" ]; then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
if [ $day = "02" ]; then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
date="$month/$yes_day/$year"
fulldate="$year$month$yes_day"
fi
fi
fi
fi
하지만 내 문제는 다음과 같은 오류 메시지가 나타납니다
Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found
답변1
[
은(는) 메타 문자도 아니고 제어 연산자도 아닙니다(예약어도 아님, 와 동일 ]
). 따라서 주위에 공백이 필요합니다. 그렇지 않으면 쉘은 별도의 인수 , 및 가 있는 명령 대신 명령을 "인식"합니다 [01=01]
. 각 연산자와 피연산자는 명령에 대한 별도의 인수여야 하므로 연산자 주위에도 공백이 필요합니다.[
01
=
01
]
[
if [ "$month" = "01" ]
[$month="01"]
$month
또는 의 모든 문자와 일치하는 와일드카드 패턴입니다 "01
. 아무것도 일치하지 않으면 그대로 두십시오.
닫는 괄호 뒤에 세미콜론이 있으면 세미콜론은 항상 별도 토큰의 일부이므로 앞에 공백이 필요하지 않습니다.
if [ "$month" = "01" ]; then
bash(및 ksh 및 zsh)의 이중 괄호 구문에도 동일하게 적용됩니다.
여러 조건
조건을 결합하는 방법에는 두 가지가 있습니다.
이내에
[
별도의 명령과
[
결합&&
하거나||
괄호로 그룹화하는 것이 더 쉬울 수 있습니다 [
.
if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or
if [ "$month" = "01" ] && [ "$day" = "01" ]
첫 번째는 신뢰할 수 없으므로 피해야 합니다(예: 를 사용하려는 경우 month='!'
). 안전한 문자열을 먼저 사용하면(가능한 경우) 이상한 변수 내용으로 인한 문제를 방지하거나 [[
/ ]]
대신 [
/를 사용합니다 ]
.
if [ "01" = "$month" -a "01" = "$day" ]
답변2
그것을 작성하는 또 다른 방법:
case $month:$day in
(01:0[12])
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
;;
(*:0[12])
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
;;
(*)
date="$month/$yes_day/$year"
fulldate="$year$month$yes_day"
esac