#!/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;
}'