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이다.$blaohai
error.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 bash
C와 동일한 연산자의 전체 목록을 표시합니다.
할당 연산자를 사용하여 인덱스 배열에 새 요소를 추가할 수도 있습니다(일명 "목록").
$ 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"san
가 danielsan
이럴 는 대신 이렇게해야 .
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
'programing' 카테고리의 다른 글
C#에서 키 누르기 이벤트를 프로그래밍 방식으로 생성하려면 어떻게 해야 합니까? (0) | 2023.04.15 |
---|---|
UIView 스크린샷을 찍는 방법 (0) | 2023.04.15 |
bat 파일에서 여러 maven 명령을 실행하는 방법은 무엇입니까? (0) | 2023.04.15 |
셀에 문자열이 포함되어 있는 경우 (0) | 2023.04.15 |
카멜 케이스를 루비 밑줄 케이스로 변환 (0) | 2023.04.15 |