代码之家  ›  专栏  ›  技术社区  ›  pmoubed

如何在bash中检查字符串中是否设置了变量?

  •  0
  • pmoubed  · 技术社区  · 7 年前

    假设我有如下内容:

    eval link='/var/lib/${XYZ}/test' # string from another text file
    

    XYZ仅用于示例,它可以是如下所示的任何内容:

    eval link='/var/lib/${MY_OWN_VAR}/test' # single quote here not double quotes
    eval link='/var/lib/${WHAT_EVER}/test'
    

    如果发生以下情况,是否可能出错 XYZ 还没定吗?或者有没有其他方法来确定 XYZ 有没有设定?

    我看过 this

    需要说明的是,所有需要计算的字符串都来自文本文件。基本上,程序读取文本文件并 输出经过计算的字符串。

    我在这里所要做的就是找到一种方法,在计算任何字符串时优雅地捕捉“unboundvariable”错误。基本上什么 set -u 她做得很优雅。

    2 回复  |  直到 7 年前
        1
  •  1
  •   jhnc    7 年前

    在实际执行评估之前,可以在子shell中测试评估:

    assign_if_defined(){
        echo 1>&2 "testing $1=$2"
        outvar="$1"
        input=${2@Q}
        err=$(exec 2>&1; set -u; eval "${outvar}=${input@P}")
        if [ -z "$err" ]; then
            echo 1>&2 "eval test succeeded: doing for real"
            eval "${outvar}=${input@P}"
        else
            echo 1>&2 "eval test failed: not doing for real"
            echo 1>&2 "error: $err"
        fi
    }
    
    A=set
    assign_if_defined link1 "'"'"\/${A}/'
    echo link1=$link1
    
    unset B
    assign_if_defined link2 '/$B/'
    echo link2=$link2
    

    看来 @Q @P eval "${outvar}=\"${input}\"" )但是如果 input 包含特殊字符(如第一个示例所示)。

        2
  •  0
  •   brunorey    7 年前

    我不知道你到底掌握了多少控制权(或知识) 做

    VAR=mydirectory
    str=/var/lib/${VAR}/test             # valid
    str2=/var/lib/${NONEXISTANT}/test    # invalid
    
    if [[ "$str" = "/var/lib//test" ]] ;
    then
        echo 'is_empty';
    else
        echo 'is_set';
    fi;
    

    唯一的缺点是,如果您收到设置为空的var,测试将失败,例如。 VAR=""

    推荐文章