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

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

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이 말했듯이 2 가지 솔루션이 있습니다.

1] 작은 따옴표 사용 ': 이 작은 따옴표는 이스케이프 문자, $다른 명령(기본적으로 모든 bash 구성 및 unix 명령)의 특별한 의미를 제거합니다. print명령은 모든 것을 일반 문자로 가져와 이를 파일에 기록합니다.test.txt

2] 큰따옴표 사용 ": 여기서는 bash 구문을 명시적으로 이스케이프해야 합니다. \$의 특별한 의미 $, 즉 뒤에 사용되는 변수의 값을 제거합니다 $.

답변4

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

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

END: 주위의 따옴표는 <<'END'다음 줄의 텍스트(마커까지 END)가 문자 그대로 사용된다는 것을 의미합니다. 을 사용하면 <<END달러 확장(예: $(command)또는 $variable)이 수행됩니다.

관련 정보