메인 스크립트에 필요한 변수를 설정하기 위해 다른 "메인" 스크립트에서 bash 스크립트를 만들었습니다. 이러한 변수는 다음을 포함할 수 있어야 합니다.어느문자를 사용하고 쉘이 문자를 해석하도록 허용하지 않습니다. 예를 들어:
- 아포스트로피:'
- 달러 기호: $
- 별표:*
- 해시 기호: # 등
그래서 내 생각은 작은 따옴표를 사용하고 묶는 작은 따옴표와 #
문자를 이스케이프하는 것입니다. 그러나 unexpected EOF while looking for matching
아래 두 파일에 오류가 발생합니다.
질문:
최소한의 조정으로 모든 문자 세트를 포함할 수 있는 문자열을 정의하는 가장 좋은 방법은 무엇입니까?
이러한 파일은 수천 개가 있으며
foo.sh
다른 소스에서 문자열을 추출할 때 이스케이프해야 하는 특수 문자의 수를 최소화하고 싶습니다.탈출해야 할 다른 캐릭터는 무엇입니까?
다음 스크립트에서 원하는 출력은 다음과 같습니다.
\MyMacro{*,Baker's Dozen,$x^$,#}
플랫폼:
- 애플 시스템 10.9.5
서브쉘: foo.sh
set -f
string_list='*,Baker\'s Dozen,$x^$,\#'
set +f
메인쉘: main.sh
source foo.sh
printf "%s{%s}" "\MyMacro" "${string_list}"
답변1
따옴표 내에서 이스케이프 할 필요가 없으며 #
작은 따옴표 안에 리터럴 작은 따옴표가 있는 것은 이상합니다.
string_list='*,Baker'\''s Dozen,$x^$,#'
하지만 큰따옴표를 사용하면 더 쉽습니다. 그래서 이렇게 :
string_list="*,Baker's Dozen,\$x^\$,#"
작동합니다.
"\""
작은 따옴표가 아닌 큰 따옴표 만 필요하며 변수 확장을 방지하기 위해 ''\'''
이스케이프도 필요합니다.$
이스케이프를 최소화하려면 '
내부 작은따옴표를 다음으로 변경하세요 '"'"'
.
string_list='*,Baker'"'"'s Dozen,$x^$,#'
답변2
다음과 같은 방법을 사용하면 이스케이프를 피할 수 있지만 이로 인해 약간의 오버헤드가 추가됩니다.
string_list=$(cat <<\!eof!
*,Baker's Dozen,$x^$,#
!eof!
)
여기에 있는 문서인 cat stdin을 사용할 수 있으며 아무 작업도 수행되지 않습니다. 문자열에 백슬래시, 작은따옴표와 큰따옴표, 공백, 여러 줄을 포함할 수도 있습니다. 효율성을 위해 다음을 사용할 수 있습니다.
read string_list <<\!eof!
*,Baker's Dozen,$x^$,#
!eof!
그러나 초기 공백과 백슬래시가 모두 손실됩니다.