【问题标题】:Improve script output改进脚本输出
【发布时间】:2011-05-24 22:43:34
【问题描述】:

我编写了一个函数来检查作为参数传递的一个或多个变量是否为空 (got the idea from here)

下面是脚本的样子:

#!/bin/bash
is_variable_defined?() {
 for VAR in "$@"; do
  : "${!VAR? "ERROR: $VAR is undefined."}"
 done
}

TEST='a'

is_variable_defined? TEST TEST2

这是输出:

/path/to/script.sh: line 4: !VAR:  ERROR: TEST2 is undefined.

但是我想输出的是:

TEST2 is undefined

我尝试调整 : "${!VAR? "ERROR: $VAR is undefined."}" 行,但无论我做什么都会中断。

有人知道要在脚本中修改什么以获得我想要的输出吗?

【问题讨论】:

  • 您是否阅读了您链接到的问题的答案? 打算打破这条信息。据我所知,另一个问题的答案就是答案。
  • 因此我的问题是,我该如何更改消息?
  • 你不能,它是一个内置函数。我可以从另一个问题中引用lhunath answerIf you just want to test whether foo is empty, instead of aborting the script, use this instead of a function: [[ $foo ]]

标签: bash


【解决方案1】:

您是否看到变量未定义或只是一个空字符串?

空测试

is_variable_defined() {
    for var in $@
    do
        if [ -z ${!var} ]   # Or if [[ ${!var} ]]
        then
            echo "Var $var has no value"
        fi
    done
}

未定义测试

is_variable_defined() {
for var in $@
do
     if ! set | grep -q "^$var="
     then
        echo "Var $var is not set"
     fi
done

最后是查看set 命令的输出以查看变量是否在此处列出。 -q 将使grep 安静。然后您查看退出状态以查看它是否找到了字符串。如果你的grep不支持-q参数,你可以试试grep "^$var=" 2> /dev/null


使用[[ $foo ]] 语法进行测试不一定有效。以下将打印 $foo is not set,即使它设置为空字符串:

foo=""
if [[ $foo ]]
then
      echo "\$foo = '$foo'"
else
      echo "\$foo is not set"
fi

【讨论】:

  • +1 用于引入 set 命令,尽管依靠 grep 来验证变量状态可能不如 Bobby 建议的 [[ $foo ]] 函数强大。
  • 问题是如果$foo 有值但为空,[[ $foo ]] 也会失败。 set 测试可以区分 foo 的值为 null 和 $foo 未设置。
猜你喜欢
  • 1970-01-01
  • 2010-12-12
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 2014-12-17
相关资源
最近更新 更多