작은따옴표 및 기타 특수 문자가 포함된 문자열을 인쇄합니다.

작은따옴표 및 기타 특수 문자가 포함된 문자열을 인쇄합니다.

AIX 스크립트를 사용하여 이를 올바르게 작성하려면 어떻게 해야 합니까? 내 요구 사항은 test.txt에 다음 명령을 작성하는 것입니다.

clock=$(prtconf -s | awk '{print $4,$5}')

나는 다음 명령을 시도했습니다.

print 'clock=$(prtconf -s | awk '{print $4,$5}')' > test.txt

test.txt에 작성된 출력은 다음과 같습니다.

clock=$(prtconf -s | awk {print ,})

따옴표를 사용하는 경우 " ":

print "clock=$(prtconf -s | awk '{print $4,$5}')"

이를 통해 직접적으로 다음을 수행할 수 있습니다.

clock=3612 MHz

이 문제를 어떻게 해결할 수 있나요?

답변1

가장 쉬운 방법은 '…'문자열 주위에 작은따옴표를 사용하는 것입니다. 작은따옴표는 리터럴 문자열을 구분하므로 작은따옴표를 제외한 모든 항목을 그 사이에 넣을 수 있습니다 '. 문자열에 작은따옴표를 삽입하려면 4개 문자 시퀀스 '\''(작은따옴표, 백슬래시, 작은따옴표, 작은따옴표)를 사용하십시오.

기술적으로 작은따옴표로 묶인 리터럴 안에 작은따옴표를 넣을 수 없습니다. 그러나 연속 텍스트는 단일 텍스트만큼 좋습니다. 'foo'\''bar'다음과 같이 구문 분석됩니다.

  1. 작은따옴표 리터럴foo
  2. 백슬래시로 묶인 리터럴 문자'
  3. 작은따옴표 리터럴bar

이것이 실제로 의미하는 바는 이것이 '\''작은따옴표 리터럴 내에서 작은따옴표를 이스케이프 처리하는 방법이라는 것입니다.

ksh print명령은 백슬래시 확장을 수행합니다. -r이를 방지하려면 옵션을 추가하세요 . 인쇄하려는 문자열에 백슬래시가 없기 때문에 문제가 되지는 않지만 -r유지 관리 중에 백슬래시가 추가되는 경우에 사용하는 것이 더 좋습니다.

print -r -- 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

또는 POSIX 메서드를 사용하여 문자열을 문자 그대로 인쇄하고 끝에 개행을 추가할 수 있습니다.

printf '%s\n' 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

답변2

계속해서 작은따옴표를 사용해야 하지만 출력에서 ​​"별도"로 필요한 작은따옴표를 인쇄하거나 큰따옴표를 사용하고 달러 기호를 이스케이프 처리해야 합니다.

두 번째 옵션의 경우:

print "clock=\$(prtconf -s | awk '{print \$4,\$5}')" > test.txt

첫 번째가 되려면:

print 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

(그런 다음 'text'작은따옴표를 이스케이프 처리합니다.)\''other text'

완전성을 위해 print백슬래시 문자 이스케이프 시퀀스를 확장하도록 주의하십시오(인쇄하려는 문자열에 백슬래시가 포함되어 있지 않으므로 이는 문제가 되지 않습니다). 이를 방지하려면 print -r.

답변3

@Mat이 말했듯이 두 가지 솔루션이 있습니다.

1] 작은 따옴표 사용: 이 작은 따옴표는 이스케이프 문자, '다양한 명령의 특별한 의미(기본적으로 모든 bash 구성 및 unix 명령)를 제거합니다. 명령은 모든 것을 일반 문자로 처리하여 파일에 씁니다.$printtest.txt

2] 큰따옴표 사용 ": 여기서는 bash 구조를 명시적으로 이스케이프해야 합니다. \$삭제의 특별한 의미 $는 나중에 사용되는 변수의 값입니다 $.

답변4

왜 그냥 사용하지 않는가?여기 문서?

cat <<'END' > test.txt
clock=$(prtconf -s | awk '{print $4,$5}')
END

END의 따옴표는 <<'END'다음 줄의 텍스트(마크업까지 END)가 문자 그대로 사용된다는 의미입니다. 또는 <<END만큼 달러 확장이 있을 것입니다 $(command).$variable

관련 정보