簡體   English   中英

如何檢查bash中的字符串中是否設置了變量?

[英]How to check if a variable is set in a string in bash?

假設我有以下內容:

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是否設置了XYZ

我已經看過這個 ,但假設還有就是你知道的變量名。 就我而言,我無法控制要評估的字符串中的內容。

UPDATE

為了清楚起見,所有需要評估的字符串均來自文本文件。 基本上,程序會讀取文本文件並輸出評估后的字符串。

我在這里嘗試的所有工作是想出一種在評估任何字符串時都能正常捕獲“未綁定變量”錯誤的方法。 基本上set -u做什么,但是很優雅。

您可以先在子外殼中測試eval,然后再進行實際測試:

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轉換首先出現在bash 4.4中。 使用它們意味着簡化了報價。 如果使用較舊版本的bash,則可以嘗試使用常規引號( eval "${outvar}=\\"${input}\\"" ),但是如果input包含特殊字符,則代碼將失敗(如第一個示例)。

好吧,我不知道究竟你多么喜歡控制(或知識)對字符串,但你不能只是測試它是否是空的?

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=""

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM