
한 스크립트에서 기본 스크립트로 변수를 내보내고 가져온 변수 중 하나를 기본 스크립트에 인수로 전달하려고 합니다.
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