bash의 변수에 개행을 삽입하려고 시도 함
이 질문에 이미 답변이 있습니다.
나는 가지고있다
var="a b c"
for i in $var
do
p=`echo -e $p'\n'$i`
done
echo $p
마지막 에코를 인쇄하고 싶습니다
a
b
c
변수 p에 개행 문자가 포함되기를 원합니다. 어떻게하나요?
요약
삽입
\n
p="${var1}\n${var2}" echo -e "${p}"
소스 코드에 새 줄 삽입
p="${var1} ${var2}" echo "${p}"
-
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'
(덜 휴대용)
bash 및 zsh$'\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
- See also BinaryZebra's answer providing many details.
- Abhijeet Rastogi's answer and Dimitry's answer explain how to avoid the
for
loop in above bash snippets.
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:
echo -e
var="$( echo -e "a\nb\nc" )"
The bash and zsh printf '%b'
var="$( printf '%b' "a\nb\nc" )"
The bash printf -v
printf -v var '%b' "a\nb\nc"
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
'code' 카테고리의 다른 글
"gdb가 코드 서명되었는지 확인하십시오-taskgated (8) 참조"-홈브류 코드 서명으로 gdb를 설치하는 방법은 무엇입니까? (0) | 2020.09.09 |
---|---|
CountDownLatch 대 세마포 (0) | 2020.09.09 |
Java JTable 설정 열 너비 (0) | 2020.09.08 |
github의 이슈를 다른 저장소로 어떻게 옮기나요? (0) | 2020.09.08 |
자바 스크립트 프로토 타입 함수에서 "this"에 대한 참조 유지 (0) | 2020.09.08 |