2016-08-24 70 views
0

我想测试一个函数参数中给出的变量的名称是否包含某个字符串,如果它没有/做不同的动作。Bash确定变量名是否包含一个字符串

这里是什么,我想实现一个非常基本的描述:

#!/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 [[ "${[email protected]}" != *"A" ]]; then 
13     echo "no A in $1" 
14   elif [[ "${[email protected]}" == *"A" ]]; then 
15     echo "A in $1" 
16   fi 
17 } 
18 
19 function1 $varA $varB $varC 
20 function1 $varD $varE $varF 

但是当运行e脚本它给出以下错误消息:

./testx.sh: line 12: ${[email protected]}: bad substitution 
./testx.sh: line 12: ${[email protected]}: bad substitution 

任何帮助将不胜感激!谢谢

+1

我不认为这是可能的位置参数。当函数被调用时,变量已被值替换,因此没有变量名称可供引用。 – karakfa

+0

这个调用实际上是'function1 $ varA $ varB $ varC'(请参阅我的第二个代码),并且我没有使用这些变量的值,但是在我正在处理的实际脚本中,我想使用它们的值在函数中执行其他操作。 – arielle

+0

@arielle:好的。在这种情况下,这是不可能的。请注意,'$ {!prefix @}'“扩展为名称以'prefix'开头的变量名称。也就是说,它等同于文件glob'prefix *',而不是shell变量的名称。 'prefix'只是一串字符。 – rici

回答

1

如果您想要“测试变量的名称”然后将其赋予该函数:

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*}(或${[email protected]})是获得所有使用名称的变量的列表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报告。

+0

这很有意义!感谢您花时间解释此:) – arielle

1

你应该做的事情

function1 "${!var*}" 

,并在函数内部

if [[ "$1" == *"A"* ]] 
then 
    echo "At least one variable name has patttern A" 
fi 
+0

但在我的真实脚本中,我想使用第一个参数的值在该函数内部执行更多操作,而不仅仅是名称,它仍然可以工作吗? – arielle

+0

可能无法使用位置参数@arielle。 :( – sjsam

+2

我不知道''$ {!var *}“'语法来查找所有以'var'开始的变量。谢谢! – anishsane

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 
+1

op表示作为函数参数给出的变量的名称包含某个字符串,它的名称不是pal的值! – sjsam

相关问题