我正在尝试将变量从一个脚本导出到主脚本,并将导入的变量之一作为参数传递给主脚本。
这是仅包含变量的脚本fruitcolour.sh
:
apple="Red"
mango="Yellow"
orange="Orange"
pear="Green"
这是主要脚本GetFruitColour.sh
:
#!/bin/bash
source fruitcolour.sh
echo "The colour of " $@ " is " $@ "."
为了作为参数传递,我想获取变量ieapple
的值。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
我已经将源脚本的路径设置为相对路径而不是裸路径,以便更清楚地显示文件所在位置(如果给定的文件名不包含斜杠,shell 将搜索该$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
您需要使用间接变量引用:
如果parameter的第一个字符是感叹号(!),并且parameter不是nameref,则它引入了间接级别。 Bash 将剩余的参数展开后形成的值作为新参数;然后将其扩展,并且该值将用于扩展的其余部分,而不是原始参数的扩展。这称为间接扩展。
水果颜色.sh:
#!/bin/bash
source fruitcolor.sh
echo "The color of $1 is ${!1}"
$ ./getfruitcolor.sh apple
The color of apple is Red