Bash -eq不起作用,可能是因为cal

时间:2014-12-29 09:35:48

标签: bash if-statement cal

#!/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个并与今天进行比较,如果状态相同则将此信息提供给脚本。

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 - 因为无论如何都要使用它,充分利用它。