일부 콘텐츠(아래 코드에 표시되는 첫 번째, 두 번째, 세 번째 공백 포함)를 추가하려는 파일이 있습니다.
### 저는 문자 메시지 1입니다 ### 저는 문자 메시지 2입니다
(제가 첨부한 실제 텍스트는 이 5줄보다 훨씬 깁니다.)
단순히 파일에 내용을 추가하려면 다음을 수행합니다.
cat <<-"EOF" >> myPath/myFile
content...
EOF
하지만 파일에 콘텐츠가 아직 존재하지 않는 경우에만 여기 문서가 콘텐츠를 추가하도록 하려면 어떻게 해야 할까요? 그렇지 않으면 작업이 중단됩니다.
파일에 부분 블록 내용만 있는 경우 전체 작업도 중단되어야 합니다.
답변1
문서가 없는 경우에만 여기에 문서를 추가하는 경우 다음을 사용할 수 있습니다 grep
.
cat <<-"EOF1" > myPath/myFile.append
content...
EOF1
if ! grep -F -q -f myPath/myFile{.append,}; then
cat myPath/myFile.append >> myPath/myFile
fi
이를 이해하려면 다음을 고려하십시오.
grep -F -q -f myPath/myFile{.append,}
셸로 확장되었습니다grep -F -q -f myPath/myFile.append myPath/myFile
.이
grep
명령은myPath/myFile
(추가할 텍스트가 포함된 파일)-F
에 포함된 고정 문자열( )을 검색하고(필요한 경우myPath/myFile.append
텍스트를 추가해야 하는 파일)-f
한 줄에 하나의 패턴( )을 읽고 고정된 문자열을 찾은 경우에만 표시합니다. 문자열(): 그렇죠종료 코드, 출력 없음(-q
).그런 다음 결과는 반전되어
!
아무것도 발견되지 않은 경우에만 블록의 일부가 실행됩니다if
.then
grep
답변2
이 답변을 찬성하지 마십시오. 그러나 Stephen의 답변을 올바른 것으로 표시했습니다. 이것은 제가 읽기 더 쉽게 변형한 것입니다.
템플릿 파일의 내용이 최종 파일에 아직 없는 경우에만 최종 파일에 추가해야 하는 경우 다음을 사용할 수 있습니다 grep
.
cat <<-"EOF1" > myPath/myTemplate
content...
EOF1
if ! grep -F -q -f myPath/myFile myPath/myTemplate; then
cat myPath/myTemplate >> myPath/myFile
fi
이 명령은 ( ) grep
에 포함된 myPath/endFile.sh
고정 문자열을 검색하여 한 줄에 하나의 패턴을 읽고 ( )만 전달합니다.-F
myPath/myTemplate
-f
종료 코드, 출력 없음( -q
).
그런 다음 결과가 반전되어 !
최종 파일의 어떤 항목과도 일치하지 않는 경우 에만 then
블록이 실행됩니다.if-then
grep
부록 - 종료 코드:
프로세스가 종료되면 작은 정수인 종료 코드를 반환합니다. 관례적으로 종료 코드 0은 성공을 나타내고 0이 아닌 경우 실패 또는 오류를 나타냅니다.
grep
일치하는 항목이 있으면 0을 반환하고, 일치하는 항목이 없으면 1을 반환합니다.if
인수의 종료 코드를 사용하여 수행할 작업을 결정합니다. 0이면 블록을 처리하고then
, 그렇지 않으면else
블록(있는 경우)을 처리합니다.구두점(
!
)은 뒤집힐 수 있습니다. 이then
블록은 grep이 아무것도 일치하지 않는 경우(또는 오류가 발생하는 경우)에만 실행됩니다.