如何使用传递的参数在Bash脚本中将其值作为全局变量调用?

如何使用传递的参数在Bash脚本中将其值作为全局变量调用?,bash,Bash,我试图写一个函数,它将采取2个参数。第一个是颜色名称,第二个是要打印的文本。 我还将颜色的变量声明为全局变量。我想使用第一个参数字符串来展开这些值 现在我用的是开关箱,我相信这是最糟糕的方法。 先谢谢你 red=$'\e[1;31m' grn=$'\e[1;32m' yel=$'\e[1;33m' blu=$'\e[1;34m' mag=$'\e[1;35m' cyn=$'\e[1;36m' end=$'\e[0m' Print() { # I want to use 1st para

我试图写一个函数,它将采取2个参数。第一个是颜色名称,第二个是要打印的文本。 我还将颜色的变量声明为全局变量。我想使用第一个参数字符串来展开这些值

现在我用的是开关箱,我相信这是最糟糕的方法。 先谢谢你

red=$'\e[1;31m'
grn=$'\e[1;32m'
yel=$'\e[1;33m'
blu=$'\e[1;34m'
mag=$'\e[1;35m'
cyn=$'\e[1;36m'
end=$'\e[0m'

Print() {
    # I want to use 1st parameter to call the variables above
    # i.e. if red is passed, then i want value of red which is '\e[1;31m'
    printf $((${1}))
    printf "$2"
    printf $end
}
函数调用


打印红色“字符串”

您指的是间接参数扩展

Print() {
    printf ${!1}
    printf "$2"
    printf $end
}
即使两个参数中的一个(特别是第二个)包含
%
,也可以确保获得预期的输出


根据有多少其他上下文使用您的颜色变量,我会将转义处理移到
Print
本身,这样您就可以简单地定义
red=31

Print() {
  printf '\033[1;%sm%s\033[0m' "${!1}" "$2"
}

您指的是间接参数展开

Print() {
    printf ${!1}
    printf "$2"
    printf $end
}
即使两个参数中的一个(特别是第二个)包含
%
,也可以确保获得预期的输出


根据有多少其他上下文使用您的颜色变量,我会将转义处理移到
Print
本身,这样您就可以简单地定义
red=31

Print() {
  printf '\033[1;%sm%s\033[0m' "${!1}" "$2"
}

您必须让bash使用${!…}将字符串解释为变量

#/bin/bash
红色=$'\e[1;31m'
grn=$'\e[1;32m'
yel=$'\e[1;3300万'
blu=$'\e[1;3400万'
mag=$'\e[1;3500万'
cyn=$'\e[1;36m'
结束=$'\e[0m'
打印(){
#我想用第一个参数调用上面的变量
#也就是说,如果红色被传递,那么我想要红色的值,它是'\e[1;31m'
echo-n${!1}
printf“$2”
printf$end
}
打印“$@”

您必须让bash使用${!…}将字符串解释为变量

!/bin/bash
红色=$'\e[1;31m'
grn=$'\e[1;32m'
yel=$'\e[1;3300万'
blu=$'\e[1;3400万'
mag=$'\e[1;3500万'
cyn=$'\e[1;36m'
结束=$'\e[0m'
打印(){
#我想用第一个参数调用上面的变量
#也就是说,如果红色被传递,那么我想要红色的值,它是'\e[1;31m'
echo-n${!1}
printf“$2”
printf$end
}
打印“$@”
尝试间接扩展:

以下是间接扩展的函数:

red=$'\e[1;31m'
grn=$'\e[1;32m'
yel=$'\e[1;33m'
blu=$'\e[1;34m'
mag=$'\e[1;35m'
cyn=$'\e[1;36m'
end=$'\e[0m'

Print() {
    # I want to use 1st parameter to call the variables above
    # i.e. if red is passed, then i want value of red which is '\e[1;31m'
    echo "${!1}$2$end"
}

Print red hello
尝试间接扩展:

以下是间接扩展的函数:

red=$'\e[1;31m'
grn=$'\e[1;32m'
yel=$'\e[1;33m'
blu=$'\e[1;34m'
mag=$'\e[1;35m'
cyn=$'\e[1;36m'
end=$'\e[0m'

Print() {
    # I want to use 1st parameter to call the variables above
    # i.e. if red is passed, then i want value of red which is '\e[1;31m'
    echo "${!1}$2$end"
}

Print red hello

对于OP:请忽略对所有3个答案的否决票;投票不反映任何答案的正确性。对于OP:请忽略对所有3个答案的否决票;投票不反映任何答案的正确性。Hey@chepner感谢您提供简化版。但我检查了您在第一条评论中所说的,我添加了“%”在字符串中,并保持打印函数不变。我对输出没有任何影响。可能我没有正确理解它。您能澄清一下吗?作为简单的示例,请尝试
foo=“%s”printf“$foo”
。您将不会得到任何输出,而不是文字输出
%s
。嘿@chepner谢谢您提供的简化版本。但是我检查了您在第一条评论中所说的,我添加了“%”在字符串中,保持打印函数的原样。我对输出没有任何影响。可能我没有正确理解它。您能澄清一下吗?作为一个简单的示例,尝试
foo=“%s”printf“$foo”
。您将不会得到输出,而不是文本输出
%s