programing

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

telecom 2023. 4. 15. 08:20
반응형

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

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

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

서서,,$foo becomes가 되다"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"

산출량

XYZ

배쉬 먼저

이 질문은 특히 Bash를 위한 것이므로, 제 답변의 첫 번째 부분은 이것을 적절하게 수행하는 다양한 방법을 제시합니다.

+=에 : " " " "

구문은 다양한 방법으로 사용할 수 있습니다.

var+=...

두 변수(변수)만합니다.foo ★★★★★★★★★★★★★★★★★」a 다음 답에서 을 다시 사용합니다 ;-)

a=2
a+=4
echo $a
24

Stack Overflow 질문 구문을 사용하여

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

정상적으로 동작합니다!

''에 ((var+=...))

"dariable''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 builtin 명령을 사용하면 문자열 형식을 그릴 수 있습니다.이것은 Bash 빌트인이기 때문에, 인쇄가 아닌 포맷된 문자열을 변수에 송신하는 옵션이 있습니다.stdout:

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

이 배열에는 7개의 문자열이 있습니다.따라서 정확히 7개의 positional 인수를 포함하는 형식화된 문자열을 구축할 수 있습니다.

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개의 필드 어레이를 가져오려면 첫 번째 요소만 재설정하면 됩니다.

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

Stack Overflow 질문 구문 사용:

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

주의: 이중 따옴표를 사용하면 다음을 포함하는 문자열을 조작할 때 유용할 수 있습니다.spaces,tabulations "/"/"newlines

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

지금 바로 셸 실행

POSIX 쉘에서는 bashism을 사용할 수 없기 때문에 빌트인은 없습니다. printf.

기본적으로

단, 다음과 같은 작업을 수행할 수 있습니다.

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

포맷 완료, 포크 사용 printf

보다 정교한 구조를 사용하려면 포크(작업을 만들고 결과를 반환하는 새로운 하위 프로세스)를 사용해야 합니다.stdout

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

이전에는 포크 결과를 검색하기 위해 backtick을 사용할 수 있었습니다.

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"

Will 출력

helloohaikthxbye

은 이, 음, 음, 음, 음, 음, 음, 다, 다, this, this, this, this, this, this이다.$blaohaierror.variable not found(변수를 수 없습니다)라는 오류가 발생합니다.문자열에 공백이나 기타 특수 문자가 있는 경우. "${foo}"제대로 빠져나갈 수 있습니다.

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

     

다음은 대부분의 답변이 말하는 내용을 간략하게 요약한 것입니다.

변수가 두 개 있고 $1이 '1'로 설정되어 있다고 가정합니다.

set one two
a=hello
b=world

에서는 '하다'의 할 수 에 대해 합니다.a ★★★★★★★★★★★★★★★★★」b하려면 , 「」를 참조해 주세요.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 참조).4행과 4행은 필요 .{}변수가 셸 변수 이름의 유효한 첫 번째 문자(알파벳 또는 밑줄)로 시작하는 문자열과 연결되어 있지 않은 한.

다음 항목도 참조하십시오.

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

$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
$ a=hip
$ b=hop
$ ab=$a$b
$ echo $ab
hiphop
$ echo $a$b
hiphop

또 다른 접근법은...

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

...그리고 또 다른 것.

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

밑줄과 같은 것을 추가할 경우 이스케이프(\)를 사용합니다.

FILEPATH=/opt/myfile

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

echo $FILEPATH_$DATEX

이것은 정상적으로 동작합니다.

echo $FILEPATH\\_$DATEX

따옴표가 있는 가장 간단한 방법:

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

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

이전 버전의 Bash에서 이 연산자를 사용하는 스크립트는 운이 좋으면 "command not found" 오류 또는 "syntax error near unexpected token" 오류와 함께 실패합니다.

하위 호환성에 관심이 있는 사용자는 선택한 답변에서 언급된 것과 같은 오래된 표준 Bash 연결 방식을 사용합니다.

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

따옴표 없이 연결할 수 있습니다.다음은 예를 제시하겠습니다.

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

이 마지막 문장은 "Open Systems"(따옴표 없음)로 인쇄됩니다.

Bash 스크립트의 예를 다음에 나타냅니다.

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

나는 곱슬 괄호를 사용하는 것을 선호한다.${}문자열 변수 확장:

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

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

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

그 이외의 사용foo = "$fooWorld"동작하지 않습니다.

특별한 운영자가 있음에도 불구하고+=, 연결에는 다음과 같은 간단한 방법이 있습니다.

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

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

Bash의 변수 및 배열(인덱스화 또는 연관성*)은 항상 기본적으로 문자열이지만 플래그를 사용하여declare 제공, "수블릭같은 합니다.-i " ( "reference"*)-n동작 방식을 바꿉니다.

Bash 산술은 ASCII/문자열 번호를 입력에 받아들이기 때문에 정수 속성을 실제로 사용해야 할 이유는 거의 없습니다.

변수 에는 ASCII를 수 .NULL 제로의 늘 되기 때문입니다. ( ) 、 8 트비 、 C の ( ( ( ( C 。

* 1면 + 1면이다.
** 에 할당됩니다.** 는 참조변수에 할당됩니다.

문자열을 추가합니다.

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

Hello world!

$ num=3
$ num+=4
echo "$num"

34 # Appended string (not a sum)

Atribute를 몇 이유 중 는 이 Atribute에 의해 이 입니다.+=「이것들」은 다음과 같습니다.

$ declare -i num=3
$ num+=4
echo "$num"

7 # Sum

문제는 안 점 하세요.-=,/=않는 (( )) ★★★★★★★★★★★★★★★★★」$(( ))정수 애트리뷰트 유무에 관계없이 번호는 이미 동일하게 취급됩니다.'산술평가'의 '하세요.man bashC와 동일한 연산자의 전체 목록을 표시합니다.

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

$ 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에서도 괜찮기 때문에, 보다 휴대성이 좋은 구문이라고 생각할 수 있습니다.

안전한 방법:

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

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

+=에 대한 다른 답변도 살펴봅니다.

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

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

출력 Will 력 will"daniel"sandanielsan이럴 는 대신 이렇게해야 .

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

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

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

공백 1개 포함:

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

또한 다음 중 하나의 공백만 추가합니다.

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

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

(주:date 상에서 OS에서는 나노초를 지원하지 않기 때문에 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 이하는 잘 몰라요.마일리지가 다를 수 있습니다.

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

이렇게 해서 2개의 스트링을 연결합니다.

「」를하는 ." World"이면하다

#!/bin/bash

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

출력:

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

리스트에서 문자열을 만들고 싶었어요.답을 찾지 못해 여기에 올렸습니다.제가 한 일은 다음과 같습니다.

list=(1 2 3 4 5)
string=''

for elm in "${list[@]}"; do
    string="${string} ${elm}"
done

echo ${string}

다음에, 다음과 같은 출력이 표시됩니다.

1 2 3 4 5

이것은 동작하지 않는 것에 주의해 주세요.

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

$foo가 떨어지면 다음과 같은 일이 생깁니다.

프리픽스_월드

이 방법은 유효합니다.

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

올바른 출력을 얻을 수 있습니다.

프리픽스_HELLO_WORLD

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

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

편리할 때는, 다음과 같이 실시합니다.인라인 명령어를 사용하세요!

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

제 생각에 두 문자열을 연결하는 가장 간단한 방법은 그것을 대신하는 함수를 작성하고 그 함수를 사용하는 것입니다.

function concat ()
{
    prefix=$1
    suffix=$2

    echo "${prefix}${suffix}"
}

foo="Super"
bar="man"

concat $foo $bar   # Superman

alien=$(concat $foo $bar)

echo $alien        # Superman

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

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

echo $(combo 'foo''bar')

고양이 가죽을 벗기는 또 다른 방법이지이번에는 함수와 함께:d

언급URL : https://stackoverflow.com/questions/4181703/how-to-concatenate-string-variables-in-bash

반응형