한 스크립트에서 기본 스크립트로 변수를 내보내고 가져온 변수 중 하나를 매개변수로 기본 스크립트에 전달하려고 합니다.
다음은 변수만 포함된 스크립트입니다 fruitcolour.sh
.
apple="Red"
mango="Yellow"
orange="Orange"
pear="Green"
이것은 주요 스크립트입니다 GetFruitColour.sh
:
#!/bin/bash
source fruitcolour.sh
echo "The colour of " $@ " is " $@ "."
apple
매개변수로 전달하기 위해 변수의 값을 얻고 싶습니다 .apple
Red
그래서 내가 달릴 때./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