>

다음과 같이 미리 정의 된 텍스트를 파일에 쓰고 싶습니다 :

text="this is line one\n
this is line two\n
this is line three"
echo -e $text > filename

다음과 같은 것을 기대하고 있습니다 :

this is line one
this is line two
this is line three

그러나 이것을 얻었다 :

this is line one
 this is line two
 this is line three

\n 마다 공간이 없다고 생각합니다 하지만 추가 공간은 어떻게 나오나요?


  • 답변 # 1

    Heredoc은이 목적에 더 편리하게 들립니다.ex또는cat

    과 같은 명령 인터프리터 프로그램에 여러 명령을 보내는 데 사용됩니다.
    cat << EndOfMessage
    This is line 1.
    This is line 2.
    Line 3.
    EndOfMessage
    
    

    << 이후의 문자열  중지 할 위치를 나타냅니다.

    이 줄을 파일로 보내려면 다음을 사용하십시오 :

    cat > $FILE <<- EOM
    Line 1.
    Line 2.
    EOM
    
    

    이 라인들을 변수에 저장할 수도 있습니다 :

    read -r -d '' VAR << EOM
    This is line 1.
    This is line 2.
    Line 3.
    EOM
    
    
    이것은 pyzwyz라는 변수에 행을 저장합니다. .

    인쇄시 변수 주위의 따옴표를 기억하십시오. 그렇지 않으면 줄 바꿈 문자가 표시되지 않습니다.

    VAR
    
    

    더 나은 방법으로 들여 쓰기를 사용하여 코드에서 더 두드러지게 만들 수 있습니다. 이번에는 그냥 echo "$VAR" 를 추가   - 후  탭이 표시되지 않도록합니다.

    <<
    
    

    하지만 코드에서 들여 쓰기를 위해 공백이 아닌 탭을 사용해야합니다.

  • 답변 # 2

    문자열을 변수로 가져 오려는 경우 또 다른 쉬운 방법은 다음과 같습니다.

    read -r -d '' VAR <<- EOM
        This is line 1.
        This is line 2.
        Line 3.
    EOM
    
    

    탭으로 문자열을 들여 쓰면 (예 : '\ t') 들여 쓰기가 제거됩니다. 공백으로 들여 쓰기하면 들여 쓰기가 그대로 유지됩니다.

    참고 : 마지막 닫는 괄호가 다른 줄에있는 것이 중요합니다. 와이즈 비즈  텍스트는 한 줄에 나타나야합니다.

  • 답변 # 3

    USAGE=$(cat <<-END This is line one. This is line two. This is line three. END )  전달 된 인수 사이에 공백을 추가합니다. 와이즈 비즈  가변 확장 및 단어 분할의 영향을 받으므로 END  명령은 다음과 같습니다.

    echo
    
    

    "this"앞에 공백이 추가 된 것을 볼 수 있습니다. 개행 문자를 제거하고 $text 를 인용 할 수 있습니다.  줄 바꿈을 유지하려면 :

    echo
    
    

    또는 echo -e "this" "is" "line" "one\n" "this" "is" "line" "two\n" ... 를 사용할 수 있습니다 $text 보다 견고하고 휴대 성이 뛰어납니다. :

    text="this is line one
    this is line two
    this is line three"
    echo "$text" > filename
    
    
    printf 에서 괄호 확장을 지원하는 다음과 같은 작업도 수행 할 수 있습니다.

    echo
    
    

  • 답변 # 4

    bash 스크립트에서 다음과 같이 작동합니다 :

    printf "%s\n" "this is line one" "this is line two" "this is line three" > filename
    
    

    대체적으로 :

    bash
    
    

    고양이 파일 이름 :

    printf "%s\n" "this is line "{one,two,three} > filename
    
    

  • 답변 # 5

    모든 줄을 올바르게 들여 쓰기 원했기 때문에 더 많은 해결책을 찾았습니다.

    <올>

    #!/bin/sh text="this is line one\nthis is line two\nthis is line three" echo $text > filename 를 사용할 수 있습니다 :

    text="this is line one
    this is line two
    this is line three"
    echo "$text" > filename
    
    

    this is line one this is line two this is line three 를 넣으면 작동하지 않습니다   echo 직전에  줄 끝에.

    또는 echo "this is line one" \ "\n""this is line two" \ "\n""this is line three" \ > filename 를 사용할 수 있습니다  더 나은 이식성을 위해 ( "\n" 에 많은 문제가 발생했습니다. ) :

    \
    
    

    아직 다른 해결책은 다음과 같습니다.

    printf
    
    

    또는

    echo
    
    

    printf '%s\n' \ "this is line one" \ "this is line two" \ "this is line three" \ > filename 를 혼합하여 다른 솔루션을 얻을 수 있습니다  그리고 text='' text="${text}this is line one\n" text="${text}this is line two\n" text="${text}this is line three\n" printf "%b" "$text" > filename .

    text=''
    text+="this is line one\n"
    text+="this is line two\n"
    text+="this is line three\n"
    printf "%b" "$text" > filename
    
    

    들여 쓰기 수준을 코드에 하드 코딩 할 때 이와 같은 형식의 코드를 리팩터링하는 것은 쉽지 않습니다.

    도우미 함수와 몇 가지 변수 대체 트릭을 사용할 수 있습니다 :

    printf
    
    

    sed

관련 자료

  • 이전 scala - Seq의 n 번째 요소를 다른 Seq 요소로 바꾸는 방법은 무엇입니까?
  • 다음 javascript - react에서 api 호출 - itemmap은 함수가 아닙니다