获取传递给脚本的参数值,从另一个脚本导入变量

获取传递给脚本的参数值,从另一个脚本导入变量

我正在尝试将变量从一个脚本导出到主脚本,并将导入的变量之一作为参数传递给主脚本。

这是仅包含变量的脚本fruitcolour.sh

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

这是主要脚本GetFruitColour.sh

#!/bin/bash

source fruitcolour.sh

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

为了作为参数传递,我想获取变量ieapple的值。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

我已经将源脚本的路径设置为相对路径而不是裸路径,以便更清楚地显示文件所在位置(如果给定的文件名不包含斜杠,shell 将搜索该$PATH变量,这可能会让您感到惊讶)。

我也曾变成echoprintf

功能上的改变是使用循环变量$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

相关内容