我想测试作为函数参数给出的变量的名称是否包含某个字符串,如果不存在则执行不同的操作。
以下是我想要实现的基本描述:
#!/bin/bash
varA="a"
varB="b"
varC="c"
varD="d"
varE="e"
varF="f"
function1 ()
{
if name of argument $1 does not contain "A"; then
echo "no A in $1"
further actions done using the value of varA and others...
elif name of argument $1 contains "A"; then
echo "A in $1"
further actions done using the value of varA and others...
fi
}
function1 $varA $varB $varC
function1 $varD $varE $varF
运行时会给出
A in varA
no A in varD
我在做一些研究时看到变量的名称可以称为$ {!var @},所以这是我尝试过的代码:
1 #!/bin/bash
2
3 varA="a"
4 varB="b"
5 varC="c"
6 varD="d"
7 varE="e"
8 varF="f"
9
10 function1 ()
11 {
12 if [[ "${!1@}" != *"A" ]]; then
13 echo "no A in $1"
14 elif [[ "${!1@}" == *"A" ]]; then
15 echo "A in $1"
16 fi
17 }
18
19 function1 $varA $varB $varC
20 function1 $varD $varE $varF
但是在运行脚本时,它会显示以下错误消息:
./testx.sh: line 12: ${!1@}: bad substitution
./testx.sh: line 12: ${!1@}: bad substitution
任何帮助将不胜感激!谢谢
答案 0 :(得分:2)
如果您想"测试变量的名称"然后将其交给函数:
function1 varA
不是变量的内容:
function1 $varA # INCORRECT
然后,您可以在函数内测试变量的名称:
if [[ $1 == *A* ]]; then
脚本可以像这样:
#!/bin/bash
function1 ()
{
if [[ $1 == *A* ]]; then
echo "A in $1"
else
echo "no A in $1"
fi
}
function1 varA varB varC
function1 varD varE varF
如果您需要" var"的值在函数内部,然后使用它:
value=${!1}
这被称为"间接扩张"在man bash
。
之后,value
将包含$1
中命名的变量的副本。
要更改$1
指向的变量的值,请使用:
declare $1=newvalue
或者,如果外部用户可以设置$ 1的值,则非常不安全:
eval $1=newvalue
使用${!var*}
(或${!var@}
)是为了获取使用以var
开头的名称的所有变量的列表。不要引用特定变量。
$ eval var{A..F}=1 # create the list of variables
$ echo ${!var*} # use the expansion to list variables
varA varB varC varD varE varF
${!1*}
的扩展应该是以1
开头的变量列表。这些变量名在bash中无效(除了作为位置参数)。也就是说:变量名不能以数字开头。
这种扩展是(因此)错误,并由bash报告。
答案 1 :(得分:1)
你应该一直在做
function1 "${!var*}"
并在函数内部
if [[ "$1" == *"A"* ]]
then
echo "At least one variable name has patttern A"
fi
答案 2 :(得分:0)
请注意您要查找的脚本仅检查函数调用的第一个变量(即$ 1)。因此,调用function1 $varA $varB $varC
只会检查varA
下面的代码将根据您编写的伪代码完成您期望的工作:
#!/bin/bash
varA="checkAinvariable"
varB="b"
varC="c"
varD="d"
varE="e"
varF="f"
function1 ()
{
if [[ "$1" != *"A"* ]]; then
echo "no A in $1"
elif [[ "$1" == *"A"* ]]; then
echo "A in $1"
fi
}
function1 $varA $varB $varC
function1 $varD $varE $varF
输出将是:
A in checkAinvariable
no A in d