code

bash의 변수에 개행을 삽입하려고 시도 함

codestyles 2020. 9. 9. 08:01
반응형

bash의 변수에 개행을 삽입하려고 시도 함


이 질문에 이미 답변이 있습니다.

나는 가지고있다

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

마지막 에코를 인쇄하고 싶습니다

a
b
c

변수 p에 개행 문자가 포함되기를 원합니다. 어떻게하나요?


요약

  1. 삽입 \n

    p="${var1}\n${var2}"
    echo -e "${p}"
    
  2. 소스 코드에 새 줄 삽입

    p="${var1}
    ${var2}"
    echo "${p}"
    
  3. 사용 $'\n'( )

    p="${var1}"$'\n'"${var2}"
    echo "${p}"
    

세부

1. 삽입 \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"

2. 소스 코드에 새 줄 삽입

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"

3. 사용하기 $'\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"

출력은 모두 동일합니다.

a
b
c

Special thanks to contributors of this answer: kevinf, Gordon Davisson, l0b0, Dolda2000 and tripleee.


EDIT


The trivial solution is to put those newlines where you want them.

var="a
b
c"

Yes, that's an assignment wrapped over multiple lines.

However, you will need to double-quote the value when interpolating it, otherwise the shell will split it on whitespace, effectively turning each newline into a single space (and also expand any wildcards).

echo "$p"

Generally, you should double-quote all variable interpolations unless you specifically desire the behavior described above.


Try echo $'a\nb'.

If you want to store it in a variable and then use it with the newlines intact, you will have to quote your usage correctly:

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

Or, to fix your example program literally:

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

There are three levels at which a newline could be inserted in a variable.
Well ..., technically four, but the first two are just two ways to write the newline in code.

1.1. At creation.

The most basic is to create the variable with the newlines already.
We write the variable value in code with the newlines already inserted.

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

Or, inside an script code:

var="a
b
c"

Yes, that means writing Enter where needed in the code.

1.2. Create using shell quoting.

The sequence $' is an special shell expansion in bash and zsh.

var=$'a\nb\nc'

The line is parsed by the shell and expanded to « var="anewlinebnewlinec" », which is exactly what we want the variable var to be.
That will not work on older shells.

2. Using shell expansions.

It is basically a command expansion with several commands:

  1. echo -e

    var="$( echo -e "a\nb\nc" )"
    
  2. The bash and zsh printf '%b'

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

    printf -v var '%b' "a\nb\nc"
    
  4. Plain simple printf (works on most shells):

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

3. Using shell execution.

두 번째 옵션에 나열된 모든 명령은 var에 특수 문자가 포함 된 경우 var의 값을 확장하는 데 사용할 수 있습니다.
따라서 우리가해야 할 일은 var 안에 해당 값을 가져 와서 다음과 같은 명령을 실행하는 것입니다.

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.

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


사이클에 사용할 필요가 없습니다

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

반응형