셸 스크립트 : 파일이 존재하지 않는 경우 파일에 여러 줄 내용을 쓰려면 어떻게해야합니까?


9

/opt/nginx/conf.d/default.conf쉘 스크립트를 통해이 내용으로 파일을 작성하고 존재하지 않는 경우 파일을 작성해야합니다.

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    root /usr/share/nginx/html;
}

쉘 스크립트를 통해 여러 줄 컨텐츠를 작성하는 방법

디렉토리를 만들었습니다

sudo mkdir -p /opt/nginx/conf.d

그러나 나는 파일을 쓰는 법을 모른다.


1
> (파일을 덮어 쓰려면) 또는 >> (이미있는 경우 추가하기)를 사용할 수 있습니다. 예 : echo "hello world"> file.txt
Rob

모든 정적 텍스트입니까, 아니면 그 일부가 동적 값으로 대체되어야합니까? (예 : 호스트 이름, 포트, 루트 디렉토리 등)
Jeff Schaller

명확히하기 위해 귀하의 질문을 편집했지만 원하는 것을 잘못 이해할 수 있습니다. 파일 이 이미있는 경우에도 파일에 내용을 추가 하시겠습니까 , 아니면 파일이없는 경우 에만 파일을 작성 하시겠습니까? 파일이 이미 존재하면 어떻게됩니까?
terdon

답변:


13

요약 : >>추가 [ -f file ]하고 테스트 하는 데 사용 합니다.

시험

if [ ! -f myfile ]
then
   cat <<EOF > myfile
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name $server ;
    root /usr/share/nginx/html;
}
EOF
fi
  • 구문을 cat <<EOF" 여기 문서 "라고합니다.
  • $server 값으로 대체되거나 정의되지 않은 경우 비어 있습니다.
  • 지적했듯이 작은 따옴표 'EOF'를 사용 하여 var가 있으면 교체하지 않아도됩니다.
  • 여러 개의 반향을 가질 수도 있습니다 (반향이 너무 많으면 유지하기가 어려울 수 있음)

    echo "## foo.conf" > foo.conf
    echo param1=hello >> foo.conf
    echo param2=world >> foo.conf
    

선행

bash에는 직접 접두사가 없으며 임시 파일을 사용하십시오.

mv file file_tmp
cat new_content file_tmp > file
rm file_tmp

또는 편집

sed -i -e '1r new_file' -e 'wq' file

여러 줄의 내용을 파일에 추가하려면 어떻게합니까?
user3142695

1
현명한 또 다른 변경 사항은 here-doc 제한 문자열을 인용하여 $(있는 경우) 포함 된 모든 단어가 변수로 취급되지 않으므로 확장되지 않도록하는 것입니다.
Inian

@ user3142695 가장 쉬운 방법은 here-document를 별도의 파일에 쓴 다음 cat두 파일을 함께 작성하고 결과 이름을 바꾸는 것입니다.
Kusalananda

여러 개의 별도 echo의 작업을 수행하려는 경우 블록에 배치하여 하나의 리디렉션 만 갖는 것이 여전히 더 효율적입니다 { echo "foo"; echo "bar"; echo "baz"; } >file.- file한 줄만 쓰고 싶을 때마다 다시 열지 않습니다 . 해당 라인이 완료되면 닫습니다.
Charles Duffy

이 문서의 또 다른 cat << EOF | sudo tee /opt/nginx/conf.d/default.conf ...
유용한 사용법

3

/opt/nginx/conf.d/default.conf 파일이 없으면 정적 문자열을 파일로 print (f)하십시오.

[ -f /opt/nginx/conf.d/default.conf ] || printf 'server {\n    listen 80 default_server;\n    listen [::]:80 default_server;\n    server_name _;\n    root /usr/share/nginx/html;\n}\n' > /opt/nginx/conf.d/default.conf

1
printf '%s\n' "first line" "second line"아마도 좀 더 읽기 쉽다고 생각합니다 . 그렇게하면 탈출구의 위치를 ​​파악하기 위해 전체 줄을 읽을 필요가 없습니다.
Charles Duffy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.