我遇到一种奇怪的情况,当我对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语句之外调用该函数,但这将需要额外的代码,我想看看是否可以使用这种简化方法首先使它起作用。有什么建议么?谢谢!
答案 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