毎月の最終勤務日

毎月の最終勤務日
#!/bin/bash
#!/usr/local/bin
#!/usr/sbin
#!/usr/bin
# Script to Check last working Day of the Month

echo " Enter Month and Year :"
read mon year
cal $mon $year| egrep  "28|29|30|31"|awk 'BEGIN {
        var1=$NF;var2=NF;
        }
        {
        if (NF > 1 &&  NF < 7)
                val=$NF;
        else if (NF == 1)
                val=$NF-2;
        else if (NF == 7)
                val=$NF-1;
        }
        {
                print "Last Working Date is : " val;
        }'

スクリプト出力:

511@ubuntu:~/Unix$ ./test.sh
 Enter Month and Year :
4 2015
Last Working Date is : 30
511@ubuntu:~/Unix$ ./test.sh
 Enter Month and Year :
5 2015
Last Working Date is : 29
Last Working Date is : 29
511@ubuntu:~/Unix$ ./test.sh
 Enter Month and Year :
7 2015
Last Working Date is : 31
511@ubuntu:~/Unix$ ./test.sh
 Enter Month and Year :
1 2015
Last Working Date is : 30

次のように入力すると、スクリプトが2回印刷されるのはなぜですか?

511@ubuntu:~/Unix$ ./test.sh
 Enter Month and Year :
5 2015
Last Working Date is : 29
Last Working Date is : 29

ベストアンサー1

問題は、egrep「28」、「29」、「30」、または「31」が表示される各行に対して検索が1回呼び出されることです。検索基準に一致する2行があるため、awk最後の週より前の28日間の月は2回呼び出されます。awk

常に検索の2行目を使用したいので、コマンドを使用して最後の行のみを表示egrepできtailます。

#!/bin/bash
#!/usr/local/bin
#!/usr/sbin
#!/usr/bin
# Script to Check last working Day of the Month

echo " Enter Month and Year :"
read mon year
cal $mon $year| egrep  "28|29|30|31"| tail -n 1 |awk 'BEGIN {
        var1=$NF;var2=NF;
        }
        {
        if (NF > 1 &&  NF < 7)
                val=$NF;
        else if (NF == 1)
                val=$NF-2;
        else if (NF == 7)
                val=$NF-1;
        }
        {
                print "Last Working Date is : " val;
        }'

おすすめ記事