Bashで文字列変数を連結する方法

bash shell syntax concat string-concatenation


PHPでは、以下のように文字列を連結します。

$foo = "Hello";
$foo .= " World";

ここで、 $foo は「Hello World」になります。

これはBashではどのようにして実現されているのでしょうか?




Answer 1 codaddict


foo="Hello"
foo="${foo} World"
echo "${foo}"
> Hello World

一般的には、2つの変数を連結するには、次から次へと書いていけばいいのです。

a='Hello'
b='World'
c="${a} ${b}"
echo "${c}"
> Hello World



Answer 2 thkala


次のコードに示すように、bashは += 演算子もサポートしています。

$ A="X Y"
$ A+=" Z"
$ echo "$A"
X Y Z



Answer 3 F. Hauri


バッシュファースト

この質問は特にBashを表しているので、私の回答の最初の部分では、これを適切に行うためのさまざまな方法を示します。

+= :変数に追加

構文 += はさまざまな方法で使用できます。

文字列 var+=... に追加

(私は質素なので、2つの変数 fooa のみを使用し、それを全体の答えで再利用します。;-)

a=2
a+=4
echo $a
24

スタックオーバーフローの質問構文を使用して、

foo="Hello"
foo+=" World"
echo $foo
Hello World

works fine!

整数に追加 ((var+=...))

変数 a は文字列ですが、整数でもあります

echo $a
24
((a+=12))
echo $a
36

配列に var+=(...)

私たちの a も1つの要素のみの配列です。

echo ${a[@]}
36

a+=(18)

echo ${a[@]}
36 18
echo ${a[0]}
36
echo ${a[1]}
18

括弧の間にスペースで区切られた配列があることに注意してください。配列にスペースを含む文字列を格納する場合は、それらを囲む必要があります。

a+=(one word "hello world!" )
bash: !": event not found

うーん.. これはバグではなく機能です... bashが開発を試みないようにするために !" 、次のことができます。

a+=(one word "hello world"! 'hello world!' $'hello world\041')

declare -p a
declare -a a='([0]="36" [1]="18" [2]="one" [3]="word" [4]="hello world!" [5]="h
ello world!" [6]="hello world!")'

printf組み込みコマンドを使用して変数を再構築します

組み込みprintf コマンドは、文字列形式を描画する強力な方法を提供します。これはBash 組み込みであるため、 stdout 代わりに、フォーマットされた文字列を変数に送信するオプションがあります。

echo ${a[@]}
36 18 one word hello world! hello world! hello world!

この配列には7つの文字列があります。したがって、正確に7つの位置引数を含むフォーマットされた文字列を作成できます。

printf -v a "%s./.%s...'%s' '%s', '%s'=='%s'=='%s'" "${a[@]}"
echo $a
36./.18...'one' 'word', 'hello world!'=='hello world!'=='hello world!'

または、送信された引数の数だけ繰り返される1つの引数フォーマット文字列を使用できます...

a はまだ配列であることに注意してください!最初の要素のみが変更されます!

declare -p a
declare -a a='([0]="36./.18...'\''one'\'' '\''word'\'', '\''hello world!'\''=='\
''hello world!'\''=='\''hello world!'\''" [1]="18" [2]="one" [3]="word" [4]="hel
lo world!" [5]="hello world!" [6]="hello world!")'

bashでは、インデックスを指定せずに変数名にアクセスした場合、常に最初の要素のみを指定します。

ですから、7つのフィールドの配列を取得するためには、1番目の要素を再設定する必要があります。

a=36
declare -p a
declare -a a='([0]="36" [1]="18" [2]="one" [3]="word" [4]="hello world!" [5]="he
llo world!" [6]="hello world!")'

1つの引数形式の文字列で、多くの引数が渡されます。

printf -v a[0] '<%s>\n' "${a[@]}"
echo "$a"
<36>
<18>
<one>
<word>
<hello world!>
<hello world!>
<hello world!>

使用スタックオーバーフローの質問構文を:

foo="Hello"
printf -v foo "%s World" $foo
echo $foo
Hello World

注意:二重引用符の使用は、 spacestabulations 、および/または newlines を含む文字列を操作するのに役立ちます。

printf -v foo "%s World" "$foo"

現在のシェル

下にPOSIXシェル、あなたが使用することができませんでしbashismsを、そう何もありません組み込みの printf 関数は。

Basically

しかし、あなたは単純にそうすることができました。

foo="Hello"
foo="$foo World"
echo $foo
Hello World

フォーマット済み、forkされた printf を使用

より洗練された構造を使用したい場合は、フォーク(ジョブを作成して stdout 経由で結果を返す新しい子プロセス)を使用する必要があります。

foo="Hello"
foo=$(printf "%s World" "$foo")
echo $foo
Hello World

歴史的には、フォークの結果を取得するためにバックティックを使用できます。

foo="Hello"
foo=`printf "%s World" "$foo"`
echo $foo
Hello World

しかし、これは入れ子にするのは簡単ではありません:

foo="Today is: "
foo=$(printf "%s %s" "$foo" "$(date)")
echo $foo
Today is: Sun Aug 4 11:58:23 CEST 2013

バックティックを使用する場合は、バックスラッシュで内側のフォークをエスケープする必要があります

foo="Today is: "
foo=`printf "%s %s" "$foo" "\`date\`"`
echo $foo
Today is: Sun Aug 4 11:59:10 CEST 2013



Answer 4 userend


こんなこともできるんですね。

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh



Answer 5 orkoden


bla=hello
laber=kthx
echo "${bla}ohai${laber}bye"

出力されます。

helloohaikthxbye

これは、 $blaohai が変数が見つからないというエラーにつながる場合に役立ち ます。または、文字列にスペースやその他の特殊文字が含まれている場合。 "${foo}" は、入力したものを適切にエスケープします。