同时检查空输出和成功退出状态

同时检查空输出和成功退出状态

我想在安装程序脚本1中编写以下测试:

if [ -n "`/etc/grub.d/30_os-prober`" ]; then
    install_dual_boot
else
    install_linux_only
fi

但是,也有可能30_os-prober不产生任何输出,因为它以某种方式未能完成。如果30_os-prober以非零退出状态失败,则假设双引导情况会更安全。

我该如何检查30_os-prober没有产生输出成功地

基本上,我想获得类似于......的效果

if [ -n "`/etc/grub.d/30_os-prober`" ]; then
    # Do stuff for a dual-boot machine
    install_dual_boot
elif ! /etc/grub.d/30_os-prober >/dev/null; then
    # OS probe failed; assume dual boot out of abundance of caution
    install_dual_boot
else
    install_linux_only
fi

…但无需运行相同的命令两次。


1背景信息:30_os-prober附带GRUB2,我正在编写的脚本是我的自定义配置的一部分固定资产投资

答案1

首先,虽然它们在功能上是等效的,但 $(…)被广泛认为比`…`- 请参阅,, 和。其次,你不需要使用$?检查命令是否成功或失败。我的注意力最近被吸引到第 2.9.1 节,简单命令Open Group 壳牌和公用事业基本规范(第 7 期):

“简单命令”是一系列可选的变量分配和重定向,可以任意顺序,可选地后跟单词和重定向,并由控制运算符终止。

当需要执行给定的简单命令时......
                          ⋮                                                                                (等等等等等等 …)

如果有命令名称,则应按照中的描述继续执行命令搜索和执行。如果没有命令名称,但该命令包含命令替换,则该命令应以上次执行的命令替换的退出状态完成。 ……

例如,

  • 命令的退出状态

    ls -ld "module_$(uname).c"
    

    是退出状态ls,但是

  • 命令的退出状态

    myfile="module_$(uname).c"
    

    是退出状态uname

所以费拉达的回答可以稍微简化一下:

如果输出=$(/etc/grub.d/30_os-prober) && [ -z "$output" ]
    # 即,如果30_os-探测器 成功地没有产生任何输出
然后
    仅安装linux
别的
    安装双启动

请注意,最好仅对环境变量(或在整个脚本中可见的变量)使用全大写名称。有限范围的变量通常以小写形式命名(或者,如果您愿意,可以使用驼峰式命名)。

答案2

您可以将值分配给变量,然后也检查退出状态:

PROBE_VALUE=`/etc/grub.d/30_os-prober`

if [ "$?" -eq 0 ] && [ -z "$PROBE_VALUE" ]; then
    install_linux_only
else
    install_dual_boot
fi

相关内容