#!/bin/bash
i=0
d="$(date +%d)"
#wrong one:
#an="$(cal | awk '/[0-9]/ {print $2}' | tail -2)"
# fixed one:
an="$(cal | col -b | sed 's/_//g' | awk '/[0-9]/ {print $2}' | tail -2)"
for e in $an
do
if [ "$d" -eq "$e" ]; then
i=1
fi
done
echo i=$i
问题在于$ an / $ e但我不明白为什么以及如何解决它。我看过,它没有任何空格,它们是数字,但是bash不会这么想。
<<编辑>>
好的我同意,也许我选择了错误的做法,只是认为用cal会很简单。 它是一个更大的脚本的一部分,所以我需要从它得到一个结果,以便脚本可以继续进行代码。 我需要在最后一个星期一,tuesadays,...或星期日得到2个并与今天进行比较,如果状态相同则将此信息提供给脚本。
答案 0 :(得分:2)
cal会使用重击来强调今天cal | less
有一个ascii打印机方便。
您需要先将其过滤掉。
col是
的工具i=0
d="$(date +%d)"
an="$(cal | col -b | awk '/[0-9]/ {print $2}' | tail -2)"
for e in $an
do
if [ "$d" -eq "$e" ]; then
i=1
fi
done
今天的替代方案是一个月中最后两个星期一之一。
# must be GNU date
(( `date -d '2 weeks' +' i = %d < 14 && %w == 1 '` ))
此表达式将i设置为1或0并返回true或false
如果你想要&#34;星期日的bug&#34;使用13 days
%w == 0
代替2 weeks
%w == 1
答案 1 :(得分:1)
如果您解释了您要解决的问题,将会有所帮助。以下可能是一个更好的方式来说明“今天是本月最后两个星期一之一吗?”我假设你的代码正在尝试做什么。
cal | awk -v d=$(date +%d) '$2==d { x=2 }
/[0-9]/ { x-- }
END { exit (!(x >= 0)) }' && i=1
当然有多种方法可以对此进行分割,但上述内容将大部分逻辑重构为Awk - 因为无论如何都要使用它,充分利用它。