1. ホーム
  2. bash

[解決済み] bashで変数に改行を埋め込もうとする [重複].

2022-07-16 01:15:55

質問

があります。

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' (ただし バッシュ zsh )

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

詳細

1. 挿入方法 \n

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

echo -e は、2つの文字 "\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' (移植性が低い)

バッシュ 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

この回答の投稿者に感謝します。 kevinf , ゴードン・デイヴィソン , l0b0 , Dolda2000 および トリプルイー .


EDIT