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