etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 10. 26. 04:48
반응형

질문자 :Strawberry


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

codaddict

Bash는 다음 코드와 같이 += 연산자도 지원합니다.

 A="XY" A+=" Z" echo "$A"

산출

XYZ


thkala

먼저 배쉬

이 질문은 특히 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 -pa declare -aa='([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 -va "%s./.%s...'%s' '%s', '%s'=='%s'=='%s'" "${a[@]}" echo $a 36./.18...'one' 'word', 'hello world!'=='hello world!'=='hello world!'

또는 제출된 많은 인수만큼 반복되는 하나의 인수 형식 문자열 을 사용할 수 있습니다.

우리의 참고 a 여전히 배열입니다! 첫 번째 요소만 변경됩니다!

 declare -pa declare -aa='([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개의 필드 배열을 검색하려면 첫 번째 요소만 재설정하면 됩니다.

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

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

 printf -va[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

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

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

지금 쉘

POSIX 셸에서는 bashisms 를 사용할 수 없으므로 내장된 printf 가 없습니다.

원래

하지만 다음과 같이 간단히 할 수 있습니다.

 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

F. Hauri

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

 $ var="myscript" $ echo $var myscript $ var=${var}.sh $ echo $var myscript.sh

userend

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

출력합니다

 helloohaikthxbye

$blaohai 가 변수를 찾을 수 없음 오류로 이어질 때 유용합니다. 또는 문자열에 공백이나 기타 특수 문자가 있는 경우. "${foo}" 는 입력한 모든 항목을 올바르게 이스케이프합니다.


orkoden

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


vinothkr

다음은 대부분의 답변에 대한 간략한 요약입니다.

두 개의 변수가 있고 $1이 '1'로 설정되어 있다고 가정해 보겠습니다.

 set one two a=hello b=world

ab 값을 결합하여 새 변수 c 를 생성할 수 있는 다양한 컨텍스트를 설명합니다.

 Context | Expression | Result (value of c) --------------------------------------+-----------------------+--------------------- Two variables | c=$a$b | helloworld A variable and a literal | c=${a}_world | hello_world A variable and a literal | c=$1world | oneworld A variable and a literal | c=$a/world | hello/world A variable, a literal, with a space | c=${a}" world" | hello world A more complex expression | c="${a}_one|${b}_2" | hello_one|world_2 Using += operator (Bash 3.1 or later) | c=$a; c+=$b | helloworld Append literal with += | c=$a; c+=" world" | hello world

몇 가지 참고 사항:

  • 할당의 RHS를 큰따옴표로 묶는 것은 일반적으로 좋은 방법이지만 많은 경우에 선택 사항입니다.
  • 큰 문자열이 특히 루프에서 작은 증분으로 구성되는 경우 +=
  • {} 사용하여 확장을 명확하게 합니다(위 표의 행 2에서와 같이). 3행과 4행에서 볼 수 있듯이, 변수가 쉘 변수 이름의 유효한 첫 번째 문자인 문자, 즉 알파벳이나 밑줄로 시작하는 문자열로 연결되지 않는 한 {}

또한보십시오:


codeforester

내가 문제를 해결하는 방법은

 $a$b

예를 들어,

 a="Hello" b=" World" c=$a$b echo "$c"

생산하는

 Hello World

예를 들어 문자열을 다른 문자열과 연결하려고 하면

 a="Hello" c="$a World"

그러면 echo "$c" 가 생성됩니다.

 Hello World

추가 공간이 있습니다.

 $aWorld

당신이 상상할 수 있듯이 작동하지 않지만

 ${a}World

생산하다

 HelloWorld

Chris Smith

$ a=hip $ b=hop $ ab=$a$b $ echo $ab hiphop $ echo $a$b hiphop

bcosca

또 다른 접근법...

 > H="Hello " > U="$H""universe." > echo $U Hello universe.

...그리고 또 하나.

 > H="Hello " > U=$H"universe." > echo $U Hello universe.

Akseli Palén

밑줄과 같은 것을 추가하려면 이스케이프(\)를 사용하십시오.

 FILEPATH=/opt/myfile

이것은 작동하지 않습니다 :

 echo $FILEPATH_$DATEX

이것은 잘 작동합니다.

 echo $FILEPATH\\_$DATEX

user2800471

따옴표를 사용하는 가장 간단한 방법:

 B=Bar b=bar var="$B""$b""a" echo "Hello ""$var"

betontalpfa

현재 += 연산자가 허용되더라도 2004년 Bash 3.1에 도입되었습니다.

이전 Bash 버전에서 이 연산자를 사용하는 스크립트는 운이 좋으면 "명령을 찾을 수 없음" 오류 또는 "예기치 않은 토큰 근처의 구문 오류" 오류와 함께 실패합니다.

이전 버전과의 호환성에 관심이 있는 사람들은 선택한 답변에서 언급한 것과 같은 이전 표준 Bash 연결 방법을 고수하십시오.

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

Louis-Félix

따옴표 없이 연결할 수 있습니다. 다음은 예입니다.

 $Variable1 Open $Variable2 Systems $Variable3 $Variable1$Variable2 $echo $Variable3

이 마지막 명령문은 "OpenSystems"(따옴표 제외)를 인쇄합니다.

다음은 Bash 스크립트의 예입니다.

 v1=hello v2=world v3="$v1 $v2" echo $v3 # Output: hello world echo "$v3" # Output: hello world

mariana soffer

문자열에서 변수를 확장 ${} 를 사용하는 것을 선호합니다.

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

중괄호는 연속 문자열 사용에 적합합니다.

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

그렇지 않으면 foo = "$fooWorld" 하면 작동하지 않습니다.


Nick Tsai

문자열을 여러 줄로 분할 하려는 경우 백슬래시를 사용할 수 있습니다.

 $ a="hello\ > world" $ echo $a helloworld

사이에 하나의 공백이 있는 경우:

 $ a="hello \ > world" $ echo $a hello world

이것은 또한 사이에 하나의 공백만 추가합니다.

 $ a="hello \ > world" $ echo $a hello world

jcarballo

더 안전한 방법:

 a="AAAAAAAAAAAA" b="BBBBBBBBBBBB" c="CCCCCCCCCCCC" d="DD DD" s="${a}${b}${c}${d}" echo "$s" AAAAAAAAAAAABBBBBBBBBBBBCCCCCCCCCCCCDD DD

공백이 포함된 문자열은 명령의 일부가 될 수 있습니다. 이러한 오류를 방지하려면 "$XXX" 및 "${XXX}"를 사용하십시오.

또한 += 에 대한 다른 답변을 살펴보십시오.


Bohdan

주의해야 할 한 가지 특별한 경우가 있습니다.

 user=daniel cat > output.file << EOF "$user"san EOF

원하는 대로 danielsan 아니라 "daniel"san 출력합니다. 이 경우 대신 다음을 수행해야 합니다.

 user=daniel cat > output.file << EOF ${user}san EOF

diogovk

+= 에도 불구하고 연결을 위한 더 간단한 방법이 있습니다.

 foo='Hello' foo=$foo' World' echo $foo

큰따옴표는 내부 변수를 해석하는 데 추가 계산 시간이 걸립니다. 가능하면 피하십시오.


Tiys

a="Hello," a=$a" World!" echo $a

이것이 두 개의 문자열을 연결하는 방법입니다.


CodeNinjaPI

" World" 를 추가하는 예라면 다음과 같을 수 있습니다.

 #!/bin/bash foo="Hello" foo=$foo" World" echo $foo

출력:

 Hello World

nonopolarity

var1='hello' var2='world' var3=$var1" "$var2 echo $var3

hari

성능에 대한 우려의 목소리가 있지만 데이터는 제공되지 않습니다. 간단한 테스트를 제안하겠습니다.

(참고: date 는 나노초를 제공하지 않으므로 Linux에서 수행해야 합니다.)

다음 내용 으로 GitHub에 append_test.sh를 만들었습니다.

 #!/bin/bash -e output(){ ptime=$ctime; ctime=$(date +%s.%N); delta=$(bc <<<"$ctime - $ptime"); printf "%2s. %16s chars time: %s delta: %s\n" $n "$(bc <<<"10*(2^$n)")" $ctime $delta; } method1(){ echo 'Method: a="$a$a"' for n in {1..32}; do a="$a$a"; output; done } method2(){ echo 'Method: a+="$a"' for n in {1..32}; do a+="$a"; output; done } ctime=0; a="0123456789"; time method$1

테스트 1:

 $ ./append_test.sh 1 Method: a="$a$a" 1. 20 chars time: 1513640431.861671143 delta: 1513640431.861671143 2. 40 chars time: 1513640431.865036344 delta: .003365201 3. 80 chars time: 1513640431.868200952 delta: .003164608 4. 160 chars time: 1513640431.871273553 delta: .003072601 5. 320 chars time: 1513640431.874358253 delta: .003084700 6. 640 chars time: 1513640431.877454625 delta: .003096372 7. 1280 chars time: 1513640431.880551786 delta: .003097161 8. 2560 chars time: 1513640431.883652169 delta: .003100383 9. 5120 chars time: 1513640431.886777451 delta: .003125282 10. 10240 chars time: 1513640431.890066444 delta: .003288993 11. 20480 chars time: 1513640431.893488326 delta: .003421882 12. 40960 chars time: 1513640431.897273327 delta: .003785001 13. 81920 chars time: 1513640431.901740563 delta: .004467236 14. 163840 chars time: 1513640431.907592388 delta: .005851825 15. 327680 chars time: 1513640431.916233664 delta: .008641276 16. 655360 chars time: 1513640431.930577599 delta: .014343935 17. 1310720 chars time: 1513640431.954343112 delta: .023765513 18. 2621440 chars time: 1513640431.999438581 delta: .045095469 19. 5242880 chars time: 1513640432.086792464 delta: .087353883 20. 10485760 chars time: 1513640432.278492932 delta: .191700468 21. 20971520 chars time: 1513640432.672274631 delta: .393781699 22. 41943040 chars time: 1513640433.456406517 delta: .784131886 23. 83886080 chars time: 1513640435.012385162 delta: 1.555978645 24. 167772160 chars time: 1513640438.103865613 delta: 3.091480451 25. 335544320 chars time: 1513640444.267009677 delta: 6.163144064 ./append_test.sh: fork: Cannot allocate memory

테스트 2:

 $ ./append_test.sh 2 Method: a+="$a" 1. 20 chars time: 1513640473.460480052 delta: 1513640473.460480052 2. 40 chars time: 1513640473.463738638 delta: .003258586 3. 80 chars time: 1513640473.466868613 delta: .003129975 4. 160 chars time: 1513640473.469948300 delta: .003079687 5. 320 chars time: 1513640473.473001255 delta: .003052955 6. 640 chars time: 1513640473.476086165 delta: .003084910 7. 1280 chars time: 1513640473.479196664 delta: .003110499 8. 2560 chars time: 1513640473.482355769 delta: .003159105 9. 5120 chars time: 1513640473.485495401 delta: .003139632 10. 10240 chars time: 1513640473.488655040 delta: .003159639 11. 20480 chars time: 1513640473.491946159 delta: .003291119 12. 40960 chars time: 1513640473.495354094 delta: .003407935 13. 81920 chars time: 1513640473.499138230 delta: .003784136 14. 163840 chars time: 1513640473.503646917 delta: .004508687 15. 327680 chars time: 1513640473.509647651 delta: .006000734 16. 655360 chars time: 1513640473.518517787 delta: .008870136 17. 1310720 chars time: 1513640473.533228130 delta: .014710343 18. 2621440 chars time: 1513640473.560111613 delta: .026883483 19. 5242880 chars time: 1513640473.606959569 delta: .046847956 20. 10485760 chars time: 1513640473.699051712 delta: .092092143 21. 20971520 chars time: 1513640473.898097661 delta: .199045949 22. 41943040 chars time: 1513640474.299620758 delta: .401523097 23. 83886080 chars time: 1513640475.092311556 delta: .792690798 24. 167772160 chars time: 1513640476.660698221 delta: 1.568386665 25. 335544320 chars time: 1513640479.776806227 delta: 3.116108006 ./append_test.sh: fork: Cannot allocate memory

오류는 내 Bash가 충돌하기 전에 최대 335.54432MB에 도달했음을 나타냅니다. 데이터를 두 배로 늘리는 것에서 상수를 추가하는 것으로 코드 를 변경하여 더 세분화된 그래프와 실패 지점을 얻을 수 있습니다. 그러나 이것은 당신이 신경을 쓰는지 여부를 결정하기에 충분한 정보를 제공해야 한다고 생각합니다. 개인적으로 100MB 이하에서는 그렇지 않습니다. 귀하의 마일리지가 다를 수 있습니다.


Bruno Bronosky

목록에서 문자열을 만들고 싶었습니다. 이에 대한 답을 찾지 못해 여기에 올립니다. 내가 한 일은 다음과 같습니다.

 list=(1 2 3 4 5) string='' for elm in "${list[@]}"; do string="${string} ${elm}" done echo ${string}

다음 출력을 얻습니다.

 1 2 3 4 5

simibac

이것은 작동하지 않습니다.

 foo=HELLO bar=WORLD foobar=PREFIX_$foo_$bar

$foo를 삭제하고 다음을 남기는 것처럼 보입니다.

PREFIX_WORLD

하지만 이것은 작동합니다:

 foobar=PREFIX_"$foo"_"$bar"

올바른 출력을 남겨주세요.

PREFIX_HELLO_WORLD


Dss

다음은 AWK를 통한 것입니다.

 $ foo="Hello" $ foo=$(awk -v var=$foo 'BEGIN{print var" World"}') $ echo $foo Hello World

Avinash Raj

편리할 때 이렇게 합니다. 인라인 명령을 사용하십시오!

 echo "The current time is `date`" echo "Current User: `echo $USER`"

Marty

bash의 변수와 배열(인덱스 또는 연관*)은 기본적으로 항상 문자열이지만 declare -i ) 또는 "참조"**( -n )와 같은 속성을 부여할 수 있습니다. 그들이 행동하는 방식을 바꾸는 것.

Bash 산술은 입력을 위해 ASCII/문자열 숫자를 허용하므로 실제로 정수 속성을 사용할 이유가 거의 없습니다.

또한 변수 값은 ASCII NULL (즉, 8비트 0)을 포함할 수 없습니다. 왜냐하면 일반 null로 끝나는 C 문자열을 사용하여 구현하기 때문입니다.

* 즉, 하나 이상의 키 + 값 쌍.
** 참조 변수는 참조 변수에 레이블이 할당된 다른 변수의 값으로 확장됩니다.

문자열 추가:

 $ foo=Hello $ foo+=' world!' $ echo "$foo" Hello world! $ num=3 $ num+=4 echo "$num" 34 # Appended string (not a sum)

정수 속성을 사용하는 몇 가지 이유 중 하나는 += 할당 연산자의 동작을 변경하기 때문입니다.

 $ declare -i num=3 $ num+=4 echo "$num" 7 # Sum

-= , /= 등에 대해 작동하지 않습니다 (( ))$(( )) ) 내부에서 수행하지 않는 한, 여기서 숫자는 이미 정수 속성의 유무에 관계없이 동일하게 처리됩니다. C와 동일한 연산자의 전체 목록은 man bash 의 "산술 평가" 섹션을 참조하십시오.

+= 할당 연산자를 사용하여 인덱스 배열 (일명 "목록")에 새 요소를 추가할 수도 있습니다.

 $ foo=(one) $ foo+=(two) $ printf 'Separate element: %s\n' "${foo[@]}" Separate element: one Separate element: two

이를 수행하는 또 다른 일반적인 방법은 카운터를 사용하는 것입니다.

 $ foo[c++]=one $ foo[c++]=two

POSIX 쉘은 사용하지 않는 += 당신이 이런 식으로 할 필요가 있으므로, 문자열을 추가 할 할당 연산자를 :

 $ foo=Hello $ foo="$foo world!" $ echo "$foo" Hello world!

이것은 bash 에서도 괜찮으므로 더 이식 가능한 구문으로 간주될 수 있습니다.


dan

제 생각에는 두 문자열을 연결하는 가장 간단한 방법은 이를 수행하는 함수를 작성한 다음 해당 함수를 사용하는 것입니다.

 function concat () { prefix=$1 suffix=$2 echo "${prefix}${suffix}" } foo="Super" bar="man" concat $foo $bar # Superman alien=$(concat $foo $bar) echo $alien # Superman

Anthony Rutledge

저는 빠른 기능을 만드는 것을 좋아합니다.

 #! /bin/sh -f function combo() { echo $@ } echo $(combo 'foo''bar')

고양이 피부를 만드는 또 다른 방법. 이번에는 기능으로 :D


CommaToast

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

반응형