제목과 본문이라는 두 개의 문자열 매개변수를 사용하는 함수(notify_dba)가 있습니다. (수정) 쉘 프롬프트에서는 잘 작동하지만 cron에서는 작동하지 않습니다. Err, 쉘이나 cron에서는 작동하지 않습니다(하지만 그래야 할까요...?):
53 notify_dba "${FRIENDLY_SERVER_NAME}: New ORA errors in AlertLog" echo ${
54 "Please check full log in ${ALERT_LOG_LOCATION}.
55 =====================================================
56 `grep -A900000 "${LAST_LINE_FROM_ARCHIVE}:" ${TEMPORARY_LOG_WITH_ORA_ERRORS} | grep -v "${LAST_LINE_FROM_ARCHIVE}:"`
57 =====================================================
58 "}
오류 발생:
Wed Jan 16 06:00:01 PST 2019
LAST_LINE_FROM_ARCHIVE=449843
LAST_LINE_FROM_TEMP= 452866
/u01/app/oracle/admin/chk_alertlog.sh: line 53: ${
"Please check full log in ${ALERT_LOG_LOCATION}.
=====================================================
`grep -A900000 "${LAST_LINE_FROM_ARCHIVE}:" ${TEMPORARY_LOG_WITH_ORA_ERRORS} | grep -v "${LAST_LINE_FROM_ARCHIVE}:"`
=====================================================
"}: bad substitution
답변1
귀하의 질문에 대한 의견에서 지적한 바와 같이, 표시되는 오류는 unquoting으로 인해 발생하며 ${
, 이는 매개변수 확장을 트리거합니다("확장" 섹션의 "매개변수 확장" 참조).man bash
).
즉, 여러 줄의 텍스트 블록을 확실히 전달할 수 있습니다. 올바르게 인용하면 됩니다.
정적이라면 작은따옴표도 괜찮습니다.
$ mlblock='line 1
> line 2'
$ printf '%s\n' "$mlblock"
line 1
line 2
실행 시 빌드하려면 , 및 의 특별한 의미를 유지하는 큰따옴표를 $
사용해야 `
합니다 \
.다른 것들 사이, 매개변수 확장 및 명령 대체:
$ text="Sample text"
$ mlblock="$text
> date: $(date)
> end"
$ printf '%s\n' "$mlblock"
Sample text
date: Wed Jan 16 22:18:33 CET 2019
end
큰따옴표 안의 문자열 어디든 나타나는 확장은 그 자체로 인용된다는 점에 유의하세요. 따라서 간격이 유지됩니다(예 Sample text
: ).
아마도 복잡한 문자열을 함수에 전달하는 가장 읽기 쉬운 방법은 변수를 사용하는 것입니다.
$ function notify_dba () {
printf '%s\n' "$1" # Print header
printf '%s\n' "$2" # Print body
}
$ notify_dba 'Header' "$mlblock"
Header
Sample text
date: Wed Jan 16 22:21:14 CET 2019
end
두 번째 인수는 다음과 같은 이유로 큰따옴표로 표시되어야 합니다. 1) 따옴표가 없으면 셸에 의해 확장되고 여러 단어가 생성되면 다음으로 변환됩니다.하나 이상의 인수2) 작은따옴표로 묶인 경우 문자 그대로 문자열로 해석됩니다 $mlblock
.
물론 함수를 호출할 때 매개변수 문자열을 작성할 수도 있습니다.
$ notify_dba 'Header' "Multi
> line body
> date: $(date)
> end"
Header
Multi
line body
date: Wed Jan 16 22:29:13 CET 2019
end