Bash确定变量名是否包含字符串

时间:2016-08-24 15:43:50

标签: bash variables

我想测试作为函数参数给出的变量的名称是否包含某个字符串,如果不存在则执行不同的操作。

以下是我想要实现的基本描述:

#!/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

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

3 个答案:

答案 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