如何编写检查 bash 命令结果的函数

时间:2021-03-16 17:56:56

标签: linux bash shell

我正在尝试编写一个简单的函数来轻松调试我的脚本并使我的代码更简单。 (3小时后仍然卡住)

我想传递给这个函数 3 个参数

  1. 命令
  2. 成功字符串
  3. 还有一个错误字符串

该函数应该执行命令并打印正确的字符串,无论它是否成功。 我所说的成功是指命令在输出中打印一些内容。

这是我尝试过的(在 CentOS7 上):

#!/bin/bash
CMD=$(yum list installed | egrep "yum.utils.\w+" | cut -d " " -f1)
SUCCESS="YES"
ERROR="NO"
foo() {
if ["$1" != ""]; then
    echo -e "$2"
else
    echo -e "$3"
fi
}
foo $CMD $SUCCESS $ERROR

不幸的是,我遇到了两个问题:

  • 首先,当 $CMD 为空时,第一个参数将是 $SUCCESS 而不是空字符串(我想要的行为)
  • 其次,我想删除控制台输出 (> /dev/null 2>&1 ???)。

你觉得有可能吗?你知道怎么做吗? 否则,使用 eval 命令有更简单的方法吗?

感谢阅读,祝您有美好的一天

瓦伦丁 M.

-------------------更正-------------------

#!/bin/bash
CMD=$(yum list installed | grep -E "yum.utils.\w+" | cut -d " " -f1)
SUCCESS="YES"
ERROR="NO"
foo() {
if [ "$1" != "" ]; then
    echo -e "$2"
else
    echo -e "$3"
fi
}
foo "$CMD" "$SUCCESS" "$ERROR"

我在这里发现了一个类似的主题:Stack overflow : How to write a Bash function that can generically test the output of executed commands?

1 个答案:

答案 0 :(得分:0)

<块引用>

不幸的是,我遇到了两个问题:

  • 首先,当 $CMD 为空时,第一个参数将是 $SUCCESS 而不是空字符串(我想要的行为)

如果您按照上面 William Pursell 的评论中的建议进行操作,则此问题已解决,因为随后传递了一个空的第一个参数。

<块引用>
  • 其次,我想删除控制台输出 (> /dev/null 2>&1 ???)。

我假设控制台输出是指输出到 STDERR,因为 STDOUT 被分配给 CMD。您的 > /dev/null 2>&1 不合适,因为它也将 STDOUT 重定向到 /dev/null;只需使用 STDERR 执行此操作:

CMD=$(yum list installed 2>/dev/null | egrep "yum.utils.\w+" | cut -d " " -f1)