다른 스크립트에서 변수를 가져오는 스크립트에 전달된 인수의 값을 가져옵니다.

다른 스크립트에서 변수를 가져오는 스크립트에 전달된 인수의 값을 가져옵니다.

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

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

관련 정보