특정 변수를 "가져오는" 방법

특정 변수를 "가져오는" 방법

두 개의 bash 스크립트가 있다고 가정해 보겠습니다.

공급자.sh, 일부 프로세스를 수행하고 "노출"되어야 MAP하지만 A다음 중 하나도 수행하지 않아야 합니다 B.

#!/bin/bash
declare -A MAP
A=hello
B=world
MAP[hello]=world

소비자.sh, 실행되고 Provider.sh의 사용이 필요합니다 MAP.

#!/bin/bash
source ./Provider.sh
echo ${MAP[hello]}  # >>> world

환경을 최대한 정리하기 위해 Provider.sh가시성을 최대한 낮추고 싶었습니다 Consumer.sh. MAP만 "소스"로 만들려면 어떻게 해야 합니까?

답변1

함수를 사용하여 변수의 범위를 결정할 수 있습니다. 예:

## Provider.sh
# Global vars
declare -A map

# Wrap the rest of Provider.sh in a function

provider() {

    # Local vars only available in this function
    declare a=hello b=world c d


    # Global vars are available
    map[hello]=world

}

provider "$@"    # Execute function, pass on any positional parameters

# Remove function
unset -f provider

$ cat Consumer.sh
. ./Provider.sh
echo "${map[hello]}"
echo "$a"
$ bash -x Consumer.sh
+ . ./Provider.sh
++ declare -A map
++ provider
++ declare a=hello b=world c d
++ map[hello]=world
++ unset -f provider
+ echo world
world
+ echo ''

답변2

함수를 사용하고 변수를 로컬 또는 전역으로 만들 수 있습니다.

#!/bin/bash

foo() {
  declare -gA MAP # make global
  local A=hello # make local
  local B=world # make local
  MAP[hello]=world
}

foo

그 다음에:

#!/bin/bash
source ./Provider.sh
[[ -z "$A" ]] && echo "Variable A not defined"
[[ -z "$B" ]] && echo "Variable B not defined"
echo ${MAP[hello]}

산출:

Variable A not defined
Variable B not defined
world

답변3

나는 쉘 스크립트의 일부만 얻을 수 있는 방법이 없다고 생각합니다. 모든 것을 얻거나 아무것도 얻지 않도록 선택할 수 있습니다.

그러나 grep파일에서 원하는 줄만 추출하여 새 파일에 쓴 다음 해당 새 파일을 가져올 수 있습니다. 물론, 코드에 복잡한 기능이 있으면 이 방법은 작동하지 않습니다.

어쨌든 이 코드를 여러 스크립트로 분할하여 필요한 것만 얻는 것이 더 좋습니다. 하나의 스크립트만 사용하려는 경우 코드를 여러 함수에 넣고 여러 위치에서 코드를 가져와서 필요한 함수만 호출할 수도 있습니다.

답변4

두 개의 파일이 있다고 가정하면 source명령줄에 두 명령을 모두 제공하고 공급자가 소비자가 나중에 사용할 수 있도록 변수를 설정하기를 원한다고 가정합니다. (아, 소비자가 생산자를 소스로 삼는다는 것을 알았습니다. 따라서 그들은 동일한 네임스페이스를 공유하고 소비자는 호출하는 네임스페이스를 오염시키지 않을 것입니다.

일부 bash_aliases 및 .bashrc.

작동하기 위해 가져와야 하는 bash 파일이 있으면 그 파일에 알림을 추가합니다 shebang.

#!/bin/echo "You have to source this file (${BASH_SOURCE}), not run it"
# -*-mode:sh;sh-shell:bash;fill-column:84-*-

/bin/bash 가 /bin/echo아닌 /bin/bash가 사용되므로 실행 시 첫 번째 줄만 표시됩니다.

${BASH_SOURCE}사용자에게 파일 위치를 묻는 메시지 도 표시됩니다.

두 번째 줄은 # -*-mode:sh;sh-shell:bash;fill-column:84-*-Emacs에게 파일을 편집하는 동안 파일을 강조 표시하고 들여쓰기하는 방법을 알아내라고 지시합니다.

guest가 제공하는 두 가지 기능은 훌륭하지만, 별도의 파일에 넣어두면 그냥 파일을 실행하면 이 기능이 활성화되지 않습니다.

그래서 여기에 방문자의 코드를 가져왔지만 여러분이 원할 것이라고 생각되는 것을 달성하기 위해 약간 변경했습니다. 또한, 얻고자 하는 파일에 넣어두는 것이 조건입니다.

#!/bin/echo "You have to source this file (${BASH_SOURCE}), not run it"
# -*-mode:sh;sh-shell:bash;fill-column:84-*-
# define producer and consumer functions

declare -A MAP  # you might want to use a different name 
                # because this is going to be in your global namespace

function provider() {
    local A=hello
    local B=world
    MAP[hello]=world   
}

## However maybe what you are wanting is a setter function instead?
function providerSetter() {
    MAP[${1}] = ${2}
}

function consumer()
    echo ${MAP[hello]}
}

## Again, you might want a getter function
function consumerGetter()
    echo ${MAP[${1}]}
}

## you can put defaults into the second functions, i.e.,
function providerSetter2() {
    MAP[${1:-hello}] = ${2:-world}
}
function consumerGetter2()
    echo ${MAP[${1:-hello}]}
}

포럼에 오신 것을 환영합니다!

관련 정보