回答

回答

我正在尝试让 grub2 在特定小时间隔内启动到 Ubuntu,否则启动到 Windows。我尝试通过编辑 /boot/grub/grub.cfg 并更改在 上用作默认操作系统的操作系统来实现此目的set default。Grub2 在其自己的类似 shell 的脚本语言上运行,并且它没有 bash date +%H,我可以使用 bash 查看我处于哪个小时并相应地设置默认操作系统。grub 在其上运行的类似 shell 的脚本语言确实具有以下内容:

A日期命令打印如下内容:

2021-03-10 18:36:29 Thursday

以及正则表达式

我想知道如何使用该regexp命令以及从命令返回小时的正则表达式是什么date

如果您认为还有其他方法可以完成我想做的事情并且更简单,请告诉我。

回答

我的问题是如何使用正则表达式在 grub2 中获取小时,但我想做的是让 grub2 根据时间在正确的操作系统上启动。经过大量研究,我找到了解决这个问题的更好方法。

  1. /boot/grub/grub.cfg使用您最喜欢的编辑器打开文件。
  2. 搜索set default命令。这是定义默认操作系统的命令。
  3. 删除 else 分支上出现的命令。
  4. 粘贴此代码。
# My script to boot on Ubuntu when on specific hours
# and days, use 'sudo update-grub' to use default grub.cfg
insmod datehook
if [ ! ("${WEEKDAY}" == "Saturday" -o "${WEEKDAY}" == "Sunday") ]; then
    if [ "${HOUR}" -ge 10 -a "${HOUR}" -le 17 ]; then
        set default="0"
    else
        set default="4"
    fi  
else
    set default="4"
fi
  1. 保存并在下次重新启动时应用这些规则。

关于代码片段

insmod datehook使以下环境变量可访问:$YEAR,,,,,,,。$MONTH$DAY$HOUR$MINUTE$SECOND$WEEKDAY

要了解 if-else 的语法,您可以参考此链接

我希望这能对将来的某人有所帮助。

答案1

我的发现与你的不同。

具体来说,在 GNU GRUB 手册 2.04 我找到了对两个缺失功能​​的引用:

16.3.20 日期

    Command: date [[year-]month-day] [hour:minute[:second]]

不带参数,打印当前日期和时间。

并且:

16.3.62 正则表达式

Command: regexp [--set [number:]var] regexp string

测试是否为正则表达式正则表达式火柴细绳. 支持的正则表达式是 POSIX.2 扩展正则表达式。如果--set给出了选项,则存储数字变量中第 1 个匹配的子表达式变量. 子表达式按照其左括号的顺序从“1”开始编号。数字默认为“1”。

根据此文档,并假设date返回一个字符串,例如2021-03-19 10:11:12,那么 regexp 应该跳过 11 个字符并提取接下来的两个字符,因此命令可能如下所示:

regexp --set hour '.{11}(.{2})' "`date`"

如果这像在普通 bash 中一样工作,那么可能会在变量中找到小时 hour

但这取决于你去测试和观察,因为有很多未知的地方,比如当小时小于 10 时,它是否仍然有两位数,等等。只有测试才能发现所有这些小细节。

相关内容