如何使用传递的参数在Bash脚本中将其值作为全局变量调用?
我试图写一个函数,它将采取2个参数。第一个是颜色名称,第二个是要打印的文本。 我还将颜色的变量声明为全局变量。我想使用第一个参数字符串来展开这些值 现在我用的是开关箱,我相信这是最糟糕的方法。 先谢谢你如何使用传递的参数在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
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
。