스크립트에 전달된 매개변수 값 가져오기, 다른 스크립트에서 변수 가져오기

스크립트에 전달된 매개변수 값 가져오기, 다른 스크립트에서 변수 가져오기

한 스크립트에서 기본 스크립트로 변수를 내보내고 가져온 변수 중 하나를 매개변수로 기본 스크립트에 전달하려고 합니다.

다음은 변수만 포함된 스크립트입니다 fruitcolour.sh.

apple="Red"
mango="Yellow"
orange="Orange"
pear="Green"

이것은 주요 스크립트입니다 GetFruitColour.sh:

#!/bin/bash

source fruitcolour.sh

echo "The colour of " $@ " is " $@ "."

apple매개변수로 전달하기 위해 변수의 값을 얻고 싶습니다 .appleRed

그래서 내가 달릴 때./GetFruitColour.sh apple

다음과 같은 출력을 제공해야 합니다.The colour of apple is Red.

답변1

이를 수행하는 한 가지 방법은 첫 번째 변수의 값에서 다른 변수를 참조하는 간접 참조를 사용하는 것입니다.

전시하다:

apple="Red"
var="apple"
echo "${!var}"

결과 :

Red

bash는 먼저 !var변수의 값을 나타낸 var다음 해당 값을 해석 ${apple}하고 Red.

따라서 GetFruitColour.sh 스크립트는 다음과 같습니다.

#!/bin/bash

source ./fruitcolour.sh

for arg in "$@"
do
  printf 'The colour of %s is %s.\n' "$arg" "${!arg}"
done

파일이 어디에 있는지 더 명확하게 하기 위해 소스 스크립트의 경로를 단순 경로 대신 상대 경로로 만들었습니다(주어진 파일 이름에 슬래시가 포함되어 있지 않으면 쉘이 해당 $PATH변수를 검색하므로 놀랄 수도 있습니다). ) .

나 또한echo~이 되다printf.

기능적 변경은 루프 변수 $arg와 간접 확장을 사용하여 원하는 값을 생성하는 것입니다.

$ ./GetFruitColour.sh apple mango
The colour of apple is Red.
The colour of mango is Yellow.

여기서는 오류 검사가 없습니다.

$ ./GetFruitColour.sh foo
The colour of foo is .

연관 배열을 사용하는 것이 더 쉬울 수도 있습니다.

declare -A fruits='([orange]="Orange" [apple]="Red" [mango]="Yellow" [pear]="Green" )'

for arg in "$@"
do
  if [ "${fruits["$arg"]-unset}" = "unset" ]
  then
    echo "I do not know the color of $arg"
  else
    printf 'The colour of %s is %s.\n' "$arg" "${fruits["$arg"]}"
  fi
done

답변2

간접 변수 참조를 사용해야 합니다.

매개변수의 첫 번째 문자가 느낌표(!)이고 매개변수가 nameref가 아닌 경우 간접 참조 수준이 도입됩니다. Bash는 나머지 인수를 확장하여 형성된 값을 새 인수로 사용하고 해당 값은 원래 인수의 확장이 아닌 나머지 확장에 사용됩니다. 이를 간접 확장이라고 합니다.

과일색상.sh:

#!/bin/bash

source fruitcolor.sh

echo "The color of $1 is ${!1}"

$ ./getfruitcolor.sh apple
The color of apple is Red

관련 정보