我们有一个 ksh 脚本,它应该将输出作为月份最后一天,但是每当我们运行它时都会收到以下错误:
cut: fields are numbered from 1
Try ‘cut —help’ for more information,
我一直试图调试这个问题,但无法成功。
以下是代码:
#!/usr/bin/ksh
if (( $(#) <= 1 )) ; then print "${0##*/} <two-digit month> <four-digit year›" ; exit 101 ; fi
typeset -Z2 month=${1}
typeset -Z4 year=${2}
typeset -i whencecal=$(whence cal 2>/dev/null | wc - l)
if (( whencecal != 1 )) ; then print "FATAL: \"cal\" command not found!" ; exit 102 ; fi
typeset -i wrdcount=$(cal ${month} ${year} | sed -e "/^$/ d" | tail -1 | wc -w)
typeset -Z2 momaxdate=$(cal ${month} ${year} | sed -e “/^$/ d” -e “s/[ ][ ]*/,/g” | tail -1 | cut -d”,” -f${wrdcount})
print ${momaxdate}
如何解决此问题
cut: fields and positions are numbered from 1
如果您将字段编号设为零, GNU coreutils 版本就会cut
抱怨这一点。字段从 1 开始编号,因此零是无效的。(如果您给它输入的不是数字,它会给出不同的错误。)现在,您知道
wrdcount
最终结果是零,所以让我们仔细看看的输出cal
。或者
od
:最后一行不是空的,但包含 22 个空格。这意味着与
/^$/
它不匹配,所以它不会被删除。你需要类似 的东西/^ *$/
,或者更确切地说/^[[:space:]]*$/
。现在,所有这些看起来都是一种获取月份最后一天的复杂方法。您可以使用 awk 更简单地做到这一点:
(
NF
给出行上的字段数,$n
是字段n,也是$NF
最后一个字段,并NF > 0
测试该行是否有一些内容,即不为空或只是空格。)或者,如评论中所示,使用 GNU coreutils 版本的日期:
(这样做的原因是,向前推进一个月可以使天数保持不变,因此它会转到下个月的第一天,从那里我们可以回到感兴趣的月份的最后一天。)