
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'
다음과 같이 구문 분석됩니다.
- 작은따옴표 리터럴
foo
- 백슬래시로 묶인 리터럴 문자
'
- 작은따옴표 리터럴
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
)이 수행됩니다.