bash - 의미 - 쉘 스크립트 변수 이어 붙이기




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

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

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

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

이것이 Bash에서 어떻게 완성 되었습니까?


배시 처음

이 질문은 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+=(...)

우리는 또한 하나의 요소로 이루어진 배열입니다.

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

또는 우리는 하나의 인수 형식 문자열 을 사용할 수 있습니다.이 문자열 은 많은 인수가 제출 된 것처럼 반복됩니다.

우리의 배열은 여전히 ​​배열입니다. 첫 번째 요소 만 변경됩니다!

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

스택 오버플로 질문 구문 사용 :

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

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

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

지금 쉘

POSIX 셸에서는 배 시즘을 사용할 수 없으므로 내장 된 printf 는 없습니다.

원래

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

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

형식화 된, forked 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

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

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

이전 버전과의 호환성에 신경을 쓰는 사람들은 선택한 답변에서 언급 한 것과 같은 오래된 표준 Bash 연결 방법을 사용하십시오.

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

PHP에 대해서는 아직 잘 모릅니다. 그러나 이것은 Linux Bash에서 작동합니다. 변수에 영향을 미치지 않으려면 다음을 시도하십시오.

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

>Hello World!

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


나는 일종의 빠른 기능을 만드는 것과 같습니다.

#! /bin/sh -f
function combo() {
    echo [email protected]
}

echo $(combo 'foo''bar')

고양이를 다듬는 또 다른 방법. 함수가있는이 시간 : D


다음은 대부분의 답변에 대해 간결하게 요약 한 것입니다.

두 개의 변수가 있다고 가정 해 보겠습니다.

a=hello
b=world

아래 표는 ab 의 값을 결합하여 새로운 변수 c 를 만들 수있는 다양한 상황을 설명합니다. 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, 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 번 행과 같습니다)

참조 :


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

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh

따옴표를 사용하는 가장 간단한 방법은 다음과 같습니다.

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

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

$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

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

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"
foo="${foo} World"
echo $foo
> Hello World

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

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

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


문제를 해결할 수있는 방법은

$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

밑줄처럼 추가하려면 이스케이프 (\)를 사용하십시오.

FILEPATH=/opt/myfile

작동하지 않습니다 .

echo $FILEPATH_$DATEX

이 잘 작동합니다.

echo $FILEPATH\\_$DATEX

아래 방법으로 시도 할 수 있습니다. 대체가 발생하면 큰 따옴표로 공백을 유지합니다.

var1="Ram "    
var2="Lakshmana" 
echo $var1$var2
or 
echo var1+=$var2 "bash support += operation.

bcsmc2rtese001 [/tmp]$ var1="Ram "  
bcsmc2rtese001 [/tmp]$ var2="Lakshmana"  
bcsmc2rtese001 [/tmp]$ echo $var1$var2  
Ram Lakshmana  

bcsmc2rtese001 [/tmp]$ var1+=$var2  
bcsmc2rtese001 [/tmp]$ echo $var1  
Ram Lakshmana

원래 문자열에 " World" 를 추가하는 것이 예일 경우 다음과 같이 할 수 있습니다.

#!/bin/bash

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

출력 :

Hello World

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

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

주의해야 할 특별한 사례가 있습니다.

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

네가 원했던 것처럼 danielsan 아닌 "daniel"san 출력 할 것이다. 이 경우 대신 다음을 수행해야합니다.

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

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

출력

helloohaikthxbye

이것은 $blaohai 가 변수를 찾을 수없는 오류로 $blaohai 때 유용합니다. 또는 문자열에 공백이나 다른 특수 문자가있는 경우 "${foo}" 는 사용자가 입력 한 내용을 적절하게 이스케이프 처리합니다.


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


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






string-concatenation