Bash에서 문자열 변수를 연결하는 방법


질문

 

PHP에서는 문자열이 다음과 같이 연결됩니다.

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

여기에서 $ Foo는 "Hello World"가됩니다.

이것은 어떻게 bash에서 성취 되었습니까?


답변

 

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

일반적으로 두 변수를 연결하기 위해서는 다른 것으로 쓸 수 있습니다.

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


답변

Bash는 또한이 코드와 같이 + = 연산자를 지원합니다.

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

산출

x Y Z.



답변

먼저 bash

이 질문은 바쉬를 위해 특별히 서 있기 때문에 대답의 첫 번째 부분은 이렇게 할 수있는 여러 가지 방법을 제시합니다.

+ = : 변수에 추가합니다

구문 + =는 다른 방식으로 사용될 수 있습니다.

String var + = ...에 추가하십시오.

(나는 난황이기 때문에, 나는 두 개의 변수를 사용하고 A를 다시 사용하고 전체 답변에서 동일하게 재사용 할 것이다. ;-)

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 : builtin 명령을 사용하여 변수 재구성

printf 내장 명령은 문자열 형식을 강력한 방법으로 제공합니다.Bash Builtin이므로 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에서 색인을 지정하지 않고 변수 이름에 액세스하면 항상 첫 번째 요소를 해결합니다!

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

많은 인수가있는 하나의 인수 형식 문자열 :

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

nota : 더블 따옴표의 사용은 공백, 표 및 / 또는 뉴 라인을 포함하는 문자열을 조작하는 데 유용 할 수 있습니다.

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

쉘 이제

POSIX 셸에서 Bashisms를 사용할 수 없으므로 Builtin Printf가 없습니다.

원래

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

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

포맷 된 포맷 인쇄물을 사용하여

더 정교한 구조물을 사용하려면 포크 (작업을 만드는 새 하위 프로세스를 통해 결과를 반환하십시오)를 사용해야합니다.

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

역사적으로 포크의 결과를 검색하기 위해 Backticks를 사용할 수 있습니다.

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


답변

당신도 이것을 할 수 있습니다 :

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh


답변

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

출력 할 것입니다

helloohaikthxbye

이것은 언제 유용합니다 $ blaohai. 변수를 찾을 수 없습니다. 오류가 없습니다.또는 문자열에 공백이나 다른 특수 문자가있는 경우."$ {foo}"이 적절하게 들어가는 모든 것을 탈출합니다.



답변

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

     

출처:https://stackoverflow.com/questions/4181703/how-to-concatenate-string-variables-in-bash