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

일반적으로 두 변수를 연결하기 위해 하나씩 작성할 수 있습니다.

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+=...

(나는 검소하기 때문에 두 개의 변수 fooa 만 사용 하고 전체 대답에서 동일하게 재사용합니다. ;-)

a=2
a+=4
echo $a
24

스택 오버플로 질문 구문을 사용하여

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

잘 작동합니다!

정수에 추가 ((var+=...))

변수 a 는 문자열이지만 정수

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

배열에 추가 var+=(...)

우리의 a 는 또한 하나의 요소의 배열입니다.

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!'

또는 우리는 하나의 인수 형식 문자열 을 사용할 수 있습니다 .

우리의 참고 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에서 index를 지정하지 않고 변수 이름에 액세스하면 항상 첫 번째 요소 만 처리합니다!

따라서 7 개의 필드 배열을 검색하려면 첫 번째 요소 만 재설정하면됩니다.

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!")'

많은 인수가 전달 된 하나의 인수 형식 문자열 :

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

은 Using 스택 오버플로 질문 구문 :

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

참고 : 큰 따옴표를 사용하면 spaces , tabulations 및 / 또는 줄 newlines 이 포함 된 문자열을 조작하는 데 유용 할 수 있습니다

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

지금 쉘

에서 POSIX 쉘, 당신은 사용할 수없는 bashisms를 , 그래서이없는 내장의 printf 와는 .

Basically

그러나 당신은 단순히 할 수 있습니다 :

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

분기 된 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}" 올바르게 이스케이프합니다.