我想要一个 bash 脚本来检查今天是否是当月的15号?
if [ $dayOfMonth == 15 ]
then
echo "15th day of month
fi
Run Code Online (Sandbox Code Playgroud)
月份中的日期可能来自命令date +%d,它date使用格式字符串调用命令%d。该格式字符串可能在date手册中有所描述,但肯定在strftime()C 函数手册中。它以两位数(可能是零填充)的形式为您提供月份中的第几天。
您可以在测试中使用它:
day=$( date +%d )
if [ "$day" = "15" ]; then
echo 'the 15th'
fi
Run Code Online (Sandbox Code Playgroud)
请注意此处使用的引用,并且字符串之间的相等性测试是通过单个=in[ ... ]测试完成的。
在bashshell (4.2+) 的最新版本中,我认为您实际上正在使用它,您还可以使用
printf -v day '%(%d)T' -1
Run Code Online (Sandbox Code Playgroud)
这将变量设置为day当月的日期,而不依赖于外部date命令。在-1表示当前日期和时间,请参阅手册中的描述。
$ date --help\nUsage: date [OPTION]... [+FORMAT]\n\xe2\x80\xa6\n %d day of month (e.g., 01)\n\xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n因此,使用字符串相等(对于最多 9 的数字需要前导零,例如= "09"):
if [ "$(date +%d)" = "15" ]; then \xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n或者使用数字相等(不需要前导零,您可以编写eg -eq 9):
if [ "$(date +%d)" -eq 9 ]; then \xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n请注意,在 bash 中,[[ $(date +%d) -eq 9 ]]不起作用,因为当您-eq在双括号而不是单括号中使用时,它会将前导零视为指示数字为八进制。同样,如果您使用算术表达式,所有 shell 都会将前导零视为表示八进制数,因此类似的(($(date +%d) == 9))操作不起作用。((($(date +%d) == 15))可以工作,但会在该月的 8 号和 9 号显示错误消息。)dayOfMonth=$(date +%d); dayOfMonth=${dayOfMonth#0}; ((d == 9))可以工作,因为在该月的某一天的情况下,只有一个前导 0。