작은 따옴표와 큰 따옴표를 모두 사용하는 경우 따옴표로 묶는 방법은 무엇입니까?

작은 따옴표와 큰 따옴표를 모두 사용하는 경우 따옴표로 묶는 방법은 무엇입니까?

대부분의 작업을 해결하기 위해 가끔 사용하는 정확한 명령과 요령이 기억나지 않아서 나중에 참조할 수 있도록 파일에 기록해 두려고 합니다. 내가 일반적으로 하는 일은 전체 명령을 echo에 넣고 빠르게 파일에 추가하는 것입니다.

이 방법은 항상 효과가 있었지만 다음과 같은 일이 처음 발생하면 위의 지침을 따를 수 없습니다.

성공 기록

$ echo "cat file1.txt | paste -d, - - ## Step 3 " >> ~/globalLog.txt

여기에 갇혀

$ echo "cat file2.txt  | sed 's/"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt

위의 내용은 따옴표가 제대로 닫히지 않았기 때문에 명백한 오류를 발생시킵니다(명령을 완료하기 위해 두 번째 명령 propmt(제 생각에는?)로 떨어짐 , 즉 제 경우에는). sed 명령은 sed 표현식에 작은따옴표( )를 PS2사용하고 있습니다. 대체하려면 큰따옴표( )를 >_사용하십시오 .'"

이 경우 전체 명령을 어떻게 포함합니까?

답변1

인용을 위해 여기 문서를 완전히 사용하지 않아도 됩니다. 작은따옴표/큰따옴표(예: 아래 예의 "EOF") 안에 레이블을 설정하면 텍스트에서 변수 및 명령 평가가 비활성화됩니다.

cat <<"EOF" >>~/globalLog.txt
cat file2.txt  | sed 's/"//g' > file3.txt ## Step 2
EOF

답변2

여러 가지 옵션이 있으며 각 옵션은 다양한 상황에서 편리합니다.

  1. 전체 문자열을 큰따옴표로 처리하고 내부의 리터럴 큰따옴표를 이스케이프 처리합니다(그런 항목이 하나만 있으면 읽기가 더 쉽지만 아마도 다음과 같은 결과가 나올 것입니다).울타리):

    echo "cat file2.txt  | sed 's/\"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
    
  2. 문자열의 다른 부분에 대해 다른 따옴표를 사용하십시오.

    echo "cat file2.txt  | sed 's/"'"'"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
    
  3. echo여러 매개변수를 처리하는 기능을 사용합니다 . 하나만 있으면 작동합니다.단어결과에는 일반적으로 각 인수 사이에 공백이 있으므로 문제가 있는 문자가 포함되어 있으므로 문자열에서 작동하지 않습니다. 대체 예:

    echo 'foo"' "'bar"
    

    인쇄

    foo" 'bar
    
  4. 여러 echo -n문(또는 printf %s)을 사용하고 뒤에는 echo없이 다음을 사용하세요 -n.

    echo -n "cat file2.txt  | sed '" >> ~/globalLog.txt
    echo -n 's/"' >> ~/globalLog.txt
    echo "//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
    
  5. 따옴표를 전혀 사용하지 말고 모든 특수 문자를 이스케이프 처리하세요.

    echo cat\ file2.txt\ \ \|\ sed\ \'s/\"//g\'\ \>\ file3.txt\ \#\#\ Step\ 2\  >> ~/globalLog.txt
    

알아채다작은따옴표로 묶인 문자열에서는 작은따옴표를 이스케이프 처리할 수 없습니다..

만약에 의심이된다면,더 많은 인용문 사용™.

그러나 귀하의 경우에는 명령을 실행하기 전에 명령을 기록한 것으로 보입니다. 이미 아주 좋은 해결책이 있습니다명령을 텍스트로 사용.

답변3

간단하고 체계적이며 POSIX 규격을 준수하는 인용 방법이 있습니다.어느끈. 다음 두 가지 규칙만 기억하면 됩니다.

  1. 다음과 같이 백슬래시를 사용하여 아포스트로피(작은따옴표)를 인용합니다.\'
  2. 다음과 같이 아포스트로피를 아포스트로피로 묶어 아포스트로피를 제외한 모든 내용을 인용합니다.'printf "foo\n"'

이러한 규칙이 어떻게 함께 사용되는지 설명하기 위해 don't다음과 같이 단어를 체계적으로 인용할 수 있습니다.'don'\''t'

일반적으로 문자열을 참조하는 더 읽기 쉬운 방법을 찾을 수 있지만 상황이 복잡해지면 필요한 참조를 얻는 신뢰할 수 있는 방법입니다.

질문에 인용된 문자열 형식은 다음과 같습니다.

$ echo 'cat file2.txt  | sed '\''s/"//g'\'' > file3.txt ## Step 2 ' >> ~/globalLog.txt

답변4

오직

$ cat >> ~/globalLog.txt
<now type your command>
echo "cat file2.txt  | sed 's/"//g' > file3.txt ## Step 2 "
<hit ctrl-d>

관련 정보