변수 확장은 원시 문자열 값에 중괄호를 추가합니다.

변수 확장은 원시 문자열 값에 중괄호를 추가합니다.

참고: 이 문제를 일으킨 스크립트의 구문 문제를 놓쳤습니다. ${bar}를 {$bar}로 전달하고 있습니다. 이러한 유형의 문제에 대해서는 제거하거나 잠글 수 있습니다.


제가 작성 중인 스크립트를 테스트하려고 합니다. 변수의 내용을 보기 위해 변수가 전달된 함수에서 에코를 시도했습니다. 이 경우 확장된 변수 주위에 중괄호가 추가됩니다. 이 작업이 수행되는 이유와 이를 방지하는 방법에 대한 아이디어가 있습니까? 명령에 변수를 전달하면 중괄호가 포함되어 오류가 발생할 수 있다고 가정합니다. 이 가정이 틀렸다면 정정해 주십시오. 코드는 다음과 같습니다.

editncopy()
{
  for i in {1..5}; do echo ${!i}; done
}

s=myserver
adir=/another/dir/
foo=/some/path/to/file.sh
bar=username@${s}:${adir}

editncopy string1 string2 ${foo} ${bar} ${s}

출력은 다음과 같습니다:

[me@home dir]$ ./myscript.sh
string1
string2
/some/path/to/file.sh
{username@server:/another/dir/}
myserver
[me@home dir]$

항상 함수의 $4 변수에 대괄호를 추가하세요({username@server:/another/dir/}은 단지 username@server:/another/dir/여야 함). 혼자서 에코를 시도했지만 (에코 $4) 중요하지 않습니다.

간단히 말해서, 이 스크립트는 sed를 사용하여 다른 스크립트의 내용을 수정한 다음 scp를 사용하여 이를 다른 서버에 복사합니다.

답변1

함수에 전달된 인수를 반복합니다(이는 스크립트의 인수를 반복하는 데에도 작동합니다).

#!/bin/sh

foo () {
    for i in "$@"; do
        printf 'Argument is "%s"\n' "$i"
    done
}

foo a b "c d" e "f g h"

산출:

Argument is "a"
Argument is "b"
Argument is "c d"
Argument is "e"
Argument is "f g h"

또는 귀하의 가치에 따라:

s=myserver
adir=/another/dir/
foo=/some/path/to/file.sh
bar=username@${s}:${adir}
foo string1 string2 ${foo} ${bar} ${s}

이것은 생산할 것입니다

Argument is "string1"
Argument is "string2"
Argument is "/some/path/to/file.sh"
Argument is "username@myserver:/another/dir/"
Argument is "myserver"

코드에 오타가 있을 수 있습니다 $. 합계가 다음과 같이 바뀌었습니다.{${bar}

$ foo {$bar}
Argument is "{username@myserver:/another/dir/}"

관련 정보