我想在安装程序脚本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
首先,虽然它们在功能上是等效的,但
$(…)
被广泛认为比`…`
- 请参阅这,这, 和这。其次,你不需要使用$?
检查命令是否成功或失败。我的注意力最近被吸引到第 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