programing

Bash에서 변수에 새 줄을 삽입하려고 합니다.

lovejava 2023. 4. 29. 08:08

Bash에서 변수에 새 줄을 삽입하려고 합니다.

있습니다

var="a b c"
for i in $var
do
   p=`echo -e $p'\n'$i`
done
echo $p

마지막 에코를 출력합니다.

a
b
c

변수 p에 새 줄이 포함되도록 합니다.그걸 어떻게 하는 거죠?

요약

  1. 소스 코드에 새 줄 삽입

     p="${var1}
     ${var2}"
     echo "${p}"
    
  2. 사용.$'\n'(Bash 및 Z해당)

     p="${var1}"$'\n'"${var2}"
     echo "${p}"
    
  3. 사용.echo -e개종하기 위해\n새로운 방침으로

     p="${var1}\n${var2}"
     echo -e "${p}"
    

세부 사항

  1. 소스 코드에 새 줄 삽입

     var="a b c"
     for i in $var
     do
        p="$p
     $i"       # New line directly in the source code
     done
     echo "$p" # Double quotes required
               # But -e not required
    

    추가 선행 새 줄 사용 안 함

     var="a b c"
     first_loop=1
     for i in $var
     do
        (( $first_loop )) &&  # "((...))" is Bash specific
        p="$i"            ||  # First -> Set
        p="$p
     $i"                      # After -> Append
        unset first_loop
     done
     echo "$p"                # No need -e
    

    함수 사용

     embed_newline()
     {
        local p="$1"
        shift
        for i in "$@"
        do
           p="$p
     $i"                      # Append
        done
        echo "$p"             # No need -e
     }
    
     var="a b c"
     p=$( embed_newline $var )  # Do not use double quotes "$var"
     echo "$p"
    
  2. 사용.$'\n'(휴대성이 떨어짐

    해석$'\n'신행으로서

     var="a b c"
     for i in $var
     do
        p="$p"$'\n'"$i"
     done
     echo "$p" # Double quotes required
               # But -e not required
    

    추가 선행 새 줄 사용 안 함

     var="a b c"
     first_loop=1
     for i in $var
     do
        (( $first_loop )) &&  # "((...))" is bash specific
        p="$i"            ||  # First -> Set
        p="$p"$'\n'"$i"       # After -> Append
        unset first_loop
     done
     echo "$p"                # No need -e
    

    함수 사용

     embed_newline()
     {
        local p="$1"
        shift
        for i in "$@"
        do
           p="$p"$'\n'"$i"    # Append
        done
        echo "$p"             # No need -e
     }
    
     var="a b c"
     p=$( embed_newline $var )  # Do not use double quotes "$var"
     echo "$p"
    
  3. 사용.echo -e개종하기 위해\n새로운 방침으로

     p="${var1}\n${var2}"
     echo -e "${p}"
    

    echo -e두 캐릭터를 해석합니다."\n"신행으로서

     var="a b c"
     first_loop=true
     for i in $var
     do
        p="$p\n$i"            # Append
        unset first_loop
     done
     echo -e "$p"             # Use -e
    

    추가 선행 새 줄 사용 안 함

     var="a b c"
     first_loop=1
     for i in $var
     do
        (( $first_loop )) &&  # "((...))" is bash specific
        p="$i"            ||  # First -> Set
        p="$p\n$i"            # After -> Append
        unset first_loop
     done
     echo -e "$p"             # Use -e
    

    함수 사용

     embed_newline()
     {
        local p="$1"
        shift
        for i in "$@"
        do
           p="$p\n$i"         # Append
        done
        echo -e "$p"          # Use -e
     }
    
     var="a b c"
     p=$( embed_newline $var )  # Do not use double quotes "$var"
     echo "$p"
    

    ⚠ 삽입"\n"문자열에 새 줄을 삽입하기에 충분하지 않습니다."\n"단지 두 글자일 뿐입니다.

출력은 모두 동일합니다.

a
b
c

답변의 기여자들에게 특별한 감사를 표합니다: 케빈프, 고든 데이비슨, l0b0, 돌다2000, 그리고 트리플리.


간단한 해결책은 새로운 선을 원하는 위치에 놓는 것입니다.

var="a
b
c"

예, 여러 줄로 묶은 과제입니다.

그러나 값을 보간할 때 값을 이중 따옴표로 묶어야 합니다. 그렇지 않으면 셸이 값을 공백으로 분할하여 새 줄을 하나의 공간으로 효과적으로 변환합니다(와일드카드도 확장합니다).

echo "$p"

일반적으로 위에서 설명한 동작을 특별히 원하지 않는 한 모든 변수 보간값을 이중 따옴표로 묶어야 합니다.

해라echo $'a\nb'.

변수에 저장한 다음 새 줄을 그대로 사용하려면 사용법을 올바르게 인용해야 합니다.

var=$'a\nb\nc'
echo "$var"

또는 예제 프로그램을 문자 그대로 수정하려면:

var="a b c"
for i in $var; do
    p="`echo -e "$p\\n$i"`"
done
echo "$p"

변수에 새 선을 삽입할 수 있는 수준은 세 가지입니다.음... 기술적으로는 4가지입니다. 하지만 처음 두 가지는 코드로 새 줄을 쓰는 두 가지 방법입니다.

1.1. 생성 시.

가장 기본적인 것은 이미 새 선으로 변수를 만드는 것입니다.우리는 이미 새 줄이 삽입된 코드에 변수 값을 씁니다.

$ var="a
> b
> c"
$ echo "$var"
a
b
c

또는 스크립트 코드 내부:

var="a
b
c"

네, 그것은 코드에서 필요한 곳에 글을 쓰는 것을 의미합니다.

1.2. 셸 견적서를 사용하여 작성합니다.

시퀀스는 Bash 및 Z 셸의 특수 셸 확장입니다.

var=$'a\nb\nc'

선은 셸에 의해 구문 분석되고 "var=""로newlinenewline 확장되며, 이것이 바로 변수 var를 원하는 것입니다.그것은 오래된 껍질에서는 작동하지 않을 것입니다.

셸 확장 사용.

기본적으로 여러 명령을 사용하는 명령 확장입니다.

  1. 반향-e

     var="$( echo -e "a\nb\nc" )"
    
  2. Bash 및 Z 셸 printf '%b'

     var="$( printf '%b' "a\nb\nc" )"
    
  3. Bash printf -v

     printf -v var '%b' "a\nb\nc"
    
  4. 일반 단순 printf(대부분의 셸에서 작동):

     var="$( printf 'a\nb\nc' )"
    

셸 실행 사용.

변수에 특수 문자가 포함된 경우 두 번째 옵션에 나열된 모든 명령을 사용하여 변수 값을 확장할 수 있습니다.

따라서 우리가 해야 할 일은 변수 내의 값을 가져와서 다음을 표시하는 몇 가지 명령을 실행하는 것입니다.

var="a\nb\nc"                 # var will contain the characters \n not a newline.

echo -e "$var"                # use echo.
printf "%b" "$var"            # use bash %b in printf.
printf "$var"                 # use plain printf.

공격자가 변수 값을 제어하는 경우 printf는 다소 안전하지 않습니다.

for 루프를 사용할 필요가 없습니다.

Bash 매개 변수 확장 기능의 이점은 다음과 같습니다.

var="a b c";
var=${var// /\\n};
echo -e $var
a
b
c

아니면 그냥 tr:

var="a b c"
echo $var | tr " " "\n"
a
b
c

sed솔루션:

echo "a b c" | sed 's/ \+/\n/g'

결과:

a
b
c
var="a b c"
for i in $var
do
   p=`echo -e "$p"'\n'$i`
done
echo "$p"

해결책은 변수 대체가 발생하는 현재 반복 중에 "로 삽입된 새 줄을 보호하는 것입니다.

언급URL : https://stackoverflow.com/questions/9139401/trying-to-embed-newline-in-a-variable-in-bash