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


2766

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

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

여기, $foo「Hello World」가됩니다.

이것은 Bash에서 어떻게 달성됩니까?


6
foo="Hello" foo=$foo" World" echo $foo 이것은 오히려 "#! / bin / sh"에서 작동했습니다
parasrish

1
공간이없는 HelloWorld를 원한다면 어떻게해야합니까?
Adi

@Adifoo1="World" foo2="Hello" foo3="$foo1$foo2"
GeneCode

공간은 bash에서 문제를
일으킨다

답변:


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

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

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

314
아마 $foo큰 따옴표 를 넣는 습관을들이는 것이 좋을 것 입니다.
Cascabel

104
대체가 발생할 때 쉘은 공백을 무시하지만 큰 따옴표는 항상 해당 공백을 보호하므로 항상 그렇게하도록 배웁니다.
딸기

62
첫 번째 예에 공백이 있어야합니까? 같은 것을 할 수 foo="$fooworld"있습니까? 나는 ...하지 가정 것
nonsensickle

341
@nonsensickle라는 이름의 변수를 찾습니다 fooworld. foo="${foo}world"... 에서와 같이 중괄호를 사용하여
명확하게하기

4
@ JVE999 예, 그것은 잘 작동하지만 내 의견으로는 코드 선명도에 좋지는 않지만 ...하지만 그것은 내 취향 일 수도 있습니다 ... 몇 가지 다른 방법도 있습니다-요점은 변수 이름이 변수가 아닌 부분과 분리되어 올바르게 구문 분석되는지 확인하십시오.
twalberg

1127

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

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

2
이 키워드를 export 키워드와 함께 사용할 수 있습니까? 예를 들어, export A+="Z"또는 어쩌면 A변수는 한 번 내보낼 필요가 있겠습니까?
levesque

3
@ levesque : 둘 다 :-). 변수는 한 번만 내 보내면되지만 export A+=Z꽤 잘 작동합니다.
thkala

38
이것은 bashism이기 때문에이 #!/bin/sh구성을 사용하여 스크립트에서 절대 사용해서는 안된다는 언급은 가치가 있다고 생각합니다 .
Score_Under

2
구체적으로 더하기 같음 연산자입니다. , 자바 스크립트와는 달리, 배쉬, 에코 $ A + $ B 인쇄 "X Y + Z"즉
phpguru는

6
bashism은 bash다른 고급 쉘 에서만 지원되는 쉘 기능입니다 . busybox sh또는 dash( /bin/sh많은 배포판에 있음) 또는 /bin/shFreeBSD 에서 제공되는 것과 같은 다른 쉘 에서는 작동하지 않습니다 .
Score_Under

960

배쉬 먼저

이 질문은 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 .

원래

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

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

4
+=운영자는 것보다 훨씬 빠르기도 $a="$a$b"의미가 어떤 .. 내 시험한다.
Matt

7
이 답변은 훌륭하지만 var=${var}.sh다른 답변 의 예가 누락 된 것 같습니다 . 매우 유용합니다.
geneorama

1
연산자 가 bash있는 유일한 쉘 +=입니까? 나는 그것이 충분히 휴대용인지 확인하고 싶다
dashesy

1
@dashesy 아니. 나는 분명히 +=연산자가 있는 유일한 쉘은 아니지만이 모든 방법은 bashisms 이므로 휴대용이 아닙니다! bash 버전이 잘못된 경우에도 특별한 버그가 발생할 수 있습니다!
F. Hauri

134

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

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh

4
특수 문자 나 공백이 사용되지 않지만 큰 따옴표, 따옴표 및 중괄호는 쓸모가 없습니다. var=myscript;var=$var.sh;echo $var이 효과는 bash, dash, busybox 및 기타에서 동일합니다.
F. Hauri

@ F.Hauri가 지적 해 주셔서 감사합니다. 그러나 숫자를 추가하면 작동 echo $var2하지 않습니다 . 예 : 생산하지 않음myscript2
Pynchia

@Pynchia .변수 이름에 잘못된 점이 있기 때문에 작동 합니다. 다른 경우 echo ${var}2또는 내 대답을
F. Hauri

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

출력

helloohaikthxbye

$blaohai 변수를 찾을 수 없음 오류가 발생할 때 유용합니다 . 또는 문자열에 공백이나 다른 특수 문자가있는 경우. "${foo}"당신이 넣은 모든 것을 올바르게 탈출합니다.


3
작동하지 않습니다. bash에서 "backupstorefolder : command not found"를 얻습니다. 여기서 "backupstorefolder"는 변수의 이름입니다.
Zian Choy

7
이렇게하면 구문 강조가 약간 도움이되고 사람의 모호성을 제거 할 수 있습니다.
Ray Foss

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

     


10
이것은 쉘 스크립팅에 가장 유용한 답변입니다. 나는 등호 전후에 공간이 있었기 때문에 지난 30 분 동안 나 자신을 발견했습니다!!
Stefan

8
foo = "$ {foo} World"
XXL

@XXL은 분명히 var의 이름을 캡슐화하기 위해 대괄호를 사용하고 싶습니다. 강력 추천
Sergio A.

33

문제를 해결하는 방법은

$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

1
... 따라서 ${a}\ World생산Hello World
XavierStuvw

이것은 나를 놀라게한다. 나는 c=$a$b여기에서와 같은 일을 할 것으로 기대했을 것입니다 c=$a World( World명령 으로 실행하려고 시도 할 것입니다 ). 나는 변수가 확장되기 전에 할당이 분석되는 것을 의미한다 .. 생각
mwfearnley

30

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

두 개의 변수가 있고 $ 1이 'one'으로 설정되어 있다고 가정 해 봅시다.

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 행에서와 같이). 3 행과 4 행에서 볼 수 있듯이 {}변수가 쉘 변수 이름의 유효한 첫 번째 문자 인 알파벳 또는 밑줄 인 문자로 시작하는 문자열과 연결되어 있지 않으면 필요 하지 않습니다.

또한보십시오:


2
성능에 관심이 있다면 내 답변 stackoverflow.com/a/47878161/117471
Bruno Bronosky


20

또 다른 접근법은 ...

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

... 그리고 아직 또 하나.

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

1
그것이 내가 한 일이며 다른 답변보다 훨씬 간단하고 간단하다는 것을 알았습니다. 가장 많이 투표 된 답변에 아무도이 옵션을 지적하지 않은 이유가 있습니까?
quimnuss

1
@quimnuss 문자열이 OP 질문에 사용 된 문자열과 일치하지 않는다는 사실은 좋은 이유 일 수 있습니다.
jlliagre

20

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

FILEPATH=/opt/myfile

작동 하지 않습니다 .

echo $FILEPATH_$DATEX

이것은 잘 작동합니다 :

echo $FILEPATH\\_$DATEX

11
또는 $ {FILEPATH} _ $ DATEX. 여기서 {}는 변수 이름의 경계를 나타내는 데 사용됩니다. 밑줄은 변수 이름에 유효한 문자이기 때문에 적절합니다. 따라서 스 니펫 bash에서는 실제로 $ FILEPATH가 아니라 FILEPATH_를 해결하려고합니다.
Nik O'Lai

1
나를 위해 하나의 변수, 즉 $ var1과 그 옆에 상수가 있었으므로 echo $ var1_costant_traling_part가 나를 위해 작동합니다.
YouAreAweAwesome

2
탈출을 위해 하나의 백래시 만 있으면됩니다 echo $a\_$b. Nik O'Lai의 의견에서 암시 된 것처럼 밑줄은 정규 문자입니다. 공백 처리는 문자열, 반향 및 연결에 훨씬 더 민감합니다. \ 이 문제가 계속 발생하면서이 스레드를 완전히 읽고 읽을 수 있습니다 .
XavierStuvw

16

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

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

1
따옴표가 너무 많습니다 (IMHO). var=$B$b"a"; echo Hello\ $var믿습니다
XavierStuvw

나는 모든 따옴표를 사용하는 것이 좋습니다. 놓칠 수없는 모든 곳에 따옴표를 넣으면 생각할 필요가 없습니다.
betontalpfa

15

따옴표없이 연결할 수 있습니다. 예를 들면 다음과 같습니다.

$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

1
첫 번째 블록의 구문이 혼란 스럽습니다. 이 $ 표시는 무엇을 의미합니까?
XavierStuvw

15

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

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

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

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

1
이것을 지적 해 주셔서 감사합니다.이 작업을 수행하는 데 필요한 버전을 검색했습니다.
Rho Phi

14

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

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

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

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

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


8

당신이 일을하려고하는 것은하는 경우 분할 여러 줄에 문자열을, 당신은 백 슬래시를 사용할 수 있습니다 :

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

사이에 공백이 하나 있습니다.

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

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

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

이것이 의미가없는 것 같습니다
installero

7

더 안전한 방법 :

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

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

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


명령으로 읽은 공백이있는 문자열의 지점이 정의 지점에 나타납니다. 그래서 d=DD DD줄 것 DD: command not found--- 마지막 DD, 발견되지 않고 D입니다 메모를. 모든 피연산자가 올바르게 형식화되고 필요한 공백이 이미 포함되어 있으면 s=${a}${b}${c}${d}; echo $s따옴표없이 간단히로 연결할 수 있습니다 . 또한 \ (이스케이프 된 공백)을 사용하여 이러한 문제를 피할 수 있습니다. --- d=echo\ echo에코 호출을 시작하지 않지만 그렇지 않습니다 d=echo echo.
XavierStuvw

7

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

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

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

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

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

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


1
이것은 작동하지만 변수 보간이 보호되지 않기 때문에 때로는 예기치 않은 결과가 발생합니다. 따라서 모든 사용 사례에이 양식을 사용할 수는 없습니다.
Anthony Rutledge

5

" World"원래 문자열 에 추가 하는 예인 경우 다음과 같습니다.

#!/bin/bash

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

출력 :

Hello World

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

2
또한 var3=$var1\ $var2동일한 효과를 갖는다
XavierStuvw

5

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

(노트: date macOS에서는 나노초를 제공하지 않으므로 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 미만은 아닙니다. 귀하의 마일리지가 다를 수 있습니다.


흥미 롭습니다! 다음을 고려하십시오 : join <(LANG=C bash -c 'a="a" c=1 last=${EPOCHREALTIME//.};while :;do a+=$a;now=${EPOCHREALTIME//.};echo $((c++)) ${#a} $((now-last));last=$now;done') <(LANG=C bash -c 'a="a" c=1 last=${EPOCHREALTIME//.};while :;do a=$a$a;now=${EPOCHREALTIME//.};echo $((c++)) ${#a} $((now-last));last=$now;done')|sed -ue '1icnt strlen a+=$a a=$a$a' -e 's/^\([0-9]\+\) \([0-9]\+\) \([0-9]\+\) \2/\1 \2 \3/' | xargs printf "%4s %11s %9s %9s\n"(생산적인 호스트가 아니라면 이것을 시도하십시오 !!;)
F. Hauri

4

목록에서 문자열을 만들고 싶었습니다. 이에 대한 답변을 찾을 수 없으므로 여기에 게시하십시오. 여기 내가 한 일이 있습니다.

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

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

echo ${string}

그런 다음 다음과 같은 출력을 얻습니다.

1 2 3 4 5

4

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

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

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


3

이 작동하지 않습니다

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

$ foo를 삭제하고 다음과 같이 남겨 둡니다.

PREFIX_WORLD

그러나 이것은 작동합니다 :

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

올바른 출력을 유지하십시오.

PREFIX_HELLO_WORLD


8
밑줄은 변수 이름에서 유효한 문자이므로 bash는 foo_를 변수로 간주합니다. 그것은 정확한 VAR 이름 경계를 bash는 말할 필요가있는 경우, 중괄호를 사용할 수 있습니다 PREFIX _ $ {foo는} _ $ 바
닉 O'Lai

2

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

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

1
좋지만 파이썬을 사용하면 더 많은 정밀도를 얻을 수 있다고 생각합니다!
techno

1

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

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

1
첫 번째 줄 에서 대신을 사용하여 포크 를 떨어 뜨릴 수 있습니다. 최근 bash에서 다음과 같이 쓸 수 있습니다. date "+The current time is %a %b %d %Y +%T"echo ...$(date)printf "The current time is %(%a %b %d %Y +%T)T\n" -1
F. Hauri

1

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

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

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

foo="Super"
bar="man"

concat $foo $bar   # Superman

alien=$(concat $foo $bar)

echo $alien        # Superman

-1

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

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

echo $(combo 'foo''bar')

고양이를 피부에 바르는 또 다른 방법. 이번에는 기능 : D


서브 쉘에서 함수를 호출하는 것은 간단한 연결에 너무 많은 과잉입니다.
codeforester

-1

아직 PHP에 대해 잘 모르지만 Linux Bash에서 작동합니다. 변수에 영향을 미치지 않으려면 다음을 시도하십시오.

read pp;  *# Assumes I will affect Hello to pp*
pp=$( printf $pp ;printf ' World'; printf '!');
echo $pp;

>Hello World!

'Hello'또는 '!'대신 다른 변수를 배치 할 수 있습니다. 더 많은 문자열을 연결할 수도 있습니다.


2
간단한 연결을 위해 서브 쉘을 사용하는 것은 너무 비싸다!
codeforester 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.