Bash函数全局变量失败

时间:2019-02-15 19:34:28

标签: bash function printf

我遇到一种奇怪的情况,当我对print语句内的函数返回运行条件检查时,该函数中设置的全局变量不起作用。让我举个例子:

function VALIDATE()
{
        BLAH BLAH BLAH
        ERROR="IT FAILED"
        return 0
}

######## Start relevant code ########
printf "%-50s %10s\n" " Validating and sanitizing input..." "$(if VALIDATE $HOST; then echo "[$RED  FAIL  $RESET]"; else echo "[$GREEN   OK   $RESET]"; fi)"
if [ -z $ERROR ]; then
        echo $ERROR
else
        echo "YAHOO IT WORKS"
fi

在printf语句中运行功能检查的某些操作会阻止$ ERROR成功传递。例如,如果我删除由printf创建的格式并重新运行代码,则ERROR会按预期工作。

最初有必要在printf内运行该函数,以简化输出的问题答案类型格式。是的,可以重写此函数,以便在printf语句之外调用该函数,但这将需要额外的代码,我想看看是否可以使用这种简化方法首先使它起作用。有什么建议么?谢谢!

1 个答案:

答案 0 :(得分:1)

命令替换$( ... )在子Shell中运行命令。因此,当您在子外壳中更改环境时,更改将在外部不可见。

x=1
$( x=2 )
echo $x # will print 1

@edit

我不建议以这种方式传递错误。您可以使用临时文件/管道将消息写入其中,也可以使用自定义文件描述符,但这并不值得,最终您将得到无法读取且可能无法维护的脚本。您的printf的问题在于,在运行Validating and sanitizing input.函数后 打印了字符串VALIDATE,因此完全打印它是很奇怪的。通常,命令返回非零退出状态,并在出现错误时将某些内容打印到stderr。看来您想从rc脚本复制状态行。

VALIDATE() {
    if false; then
        echo "valid"
    else
        echo "IT FAILED" >&2
        return 1
    fi
}

# First notify the user we are validating the input
printf "%-50s" " Validating and sanitizing input..."
# then validate input
if validate_error=$(VALIDATE 2>&1); then
    printf "$GREEN%10s$RESET\n" "[   OK   ]"
    echo "YAHOO IT WORKS"
else
    printf "$RED%10s$RESET\n"   "[  FAIL  ]"
    echo "$validate_error"
fi

,您可以将其包装在函数中,然后将命令作为参数传递:

run() {
    local errorstr
    # First notify the user we are validating the input
    printf "%-50s" "${1}..."
    shift
    if errorstr=$("$@" 2>&1); then
        printf "$GREEN%10s$RESET\n" "[   OK   ]"
    else
        printf "$RED%10s$RESET\n"   "[  FAIL  ]"
        echo "$errorstr"
    fi    
}

run "Validating and sanitizing input" VALIDATE