El siguiente guión:
N=5
BUSINESS_DATE=`date -d "-2 day" +"%Y%m%d"`
for (( c=0; c<N ; c++ ))
do
WEEKDAY=`date --date="$BUSINESS_DATE -$c day" +%w`
if [ $WEEKDAY == "0" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day-2day" +%Y%m%d`;
elif [ $WEEKDAY == "6" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day -2day" +%Y%m%d`;
elif [ $WEEKDAY == "5" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day -2day" +%Y%m%d`;
elif [ $WEEKDAY == "4" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day -2day" +%Y%m%d`;
elif [ $WEEKDAY == "3" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day -2day" +%Y%m%d`;
elif [ $WEEKDAY == "2" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day -2day" +%Y%m%d`;
elif [ $WEEKDAY == "1" ]
then
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day -2day" +%Y%m%d`;
else
FILE_DT_TMP=`date --date="$BUSINESS_DATE -$c day" +%Y%m%d`
fi
export FILE_DT=$FILE_DT_TMP
echo "File date is :$FILE_DT"
done
no está dando un resultado adecuado. ¿Alguien puede aconsejarme: qué está mal y cómo lo soluciono?
Respuesta1
Si quieres sólo 5 días hábiles antes de hoy prueba:
for d in Mon Tue Wed Thu Fri
do
date +%Y%m%d -d "last $d"
done | sort
Para cualquier N días antes de hoy:
N=10
for i in $(seq $(($N + $N / 5 * 2)) -1 1)
do
[ `date --date="-$i day" +%u` -le 5 ] &&
date -d "-$i day" +"File date is : %Y%m%d"
done
Respuesta2
Entiendo que en realidad desea que se incluyan N días en lugar de los cinco codificados que mostró en su pregunta. Aquí hay una bash
solución que abordará este requisito:
n=5
today=$(date +'%Y-%m-%d')
for ((d=1; n>0; d++))
do
# Adjust this next line to get the date format you require, e.g. +'%Y%m%d'
date=$(date --date "$today -$d day")
nday=$(date --date "$today -$d day" +'%w')
if [[ nday > 0 && nday < 6 ]]
then
# Adjust this next line to output whatever you really need
echo "n=$n, d=$d, nday=$nday, date=$date: WEEKDAY"
((n--))
fi
done
Salida de n=5
, ejecutada el 5 de noviembre de 2015.
n=5, d=1, nday=3, date=Wed, 4 Nov 2015 00:00:00: WEEKDAY
n=4, d=2, nday=2, date=Tue, 3 Nov 2015 00:00:00: WEEKDAY
n=3, d=3, nday=1, date=Mon, 2 Nov 2015 00:00:00: WEEKDAY
n=2, d=6, nday=5, date=Fri, 30 Oct 2015 00:00:00: WEEKDAY
n=1, d=7, nday=4, date=Thu, 29 Oct 2015 00:00:00: WEEKDAY
Respuesta3
Cuando aplico estos cambios a su script:
1c1
< BUSSINESS_DATE=date -d "-2 day" +"%Y%m%d"
---
> BUSSINESS_DATE=$(date -d "-2 day" +"%Y%m%d")
5c5
< WEEKDAY=date --date="$BUSSINESS_DATE -$c day" +%w
---
> WEEKDAY=$(date --date="$BUSSINESS_DATE -$c day" +%w)
Obtengo este resultado:
File date is :20151101
File date is :20151031
File date is :20151030
File date is :20151029
File date is :20151028
¿Es eso lo que estás buscando?
Respuesta4
Vaya, eso es extraordinariamente ilegible. Intente utilizar una declaración de caso en lugar de if/then/elif/else/fi.
p.ej
BUSSINESS_DATE=$(date -d "-2 day" +"%Y%m%d")
for (( c=0; c<5 ; c++ )) ; do
WEEKDAY=$(date --date="$BUSSINESS_DATE -$c day" +%w)
case "$WEEKDAY" in
0) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day-2day" +%Y%m%d) ;;
6) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day -2day" +%Y%m%d) ;;
5) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day -2day" +%Y%m%d) ;;
4) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day -2day" +%Y%m%d) ;;
3) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day -2day" +%Y%m%d) ;;
2) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day -2day" +%Y%m%d) ;;
1) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day -2day" +%Y%m%d) ;;
*) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day" +%Y%m%d) ;;
esac
export FILE_DT=$FILE_DT_TMP
echo "File date is :$FILE_DT"
done
Tenga en cuenta que reformatearlo para hacerlo más legible también hace que sea realmente obvio que falta un espacio entre day
y -2day
sobre el 0
estuche. fácilmente arreglado.
0) FILE_DT_TMP=$(date --date="$BUSSINESS_DATE -$c day-2 day" +%Y%m%d) ;;
Por cierto, si fuera usted, haría los nombres de las variables mucho más cortos (y tal vez agregaría un comentario antes del primer uso para indicar claramente cuáles son) para que el script sea aún más legible, evitando el ajuste de líneas.
por ejemplo, cambiar BUSINESS_DATE a BD
# BD is Business Date
BD=$(date -d "-2 day" +"%Y%m%d")
FILE_DT_TMP
podría cambiarse el nombre a FDT
, y FILE_DT
a FD
o FDATE
.
BD=$(date -d "-2 day" +"%Y%m%d")
for (( c=0; c<5 ; c++ )) ; do
WEEKDAY=$(date --date="$BD -$c day" +%w)
case "$WEEKDAY" in
0) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
6) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
5) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
4) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
3) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
2) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
1) FDT=$(date --date="$BD -$c day -2day" +%Y%m%d) ;;
*) FDT=$(date --date="$BD -$c day" +%Y%m%d) ;;
esac
FDATE="$FDT"
echo "File date is : $FDATE""
done
Hay una verdadera ventaja al reformatear código como este: cuando las cosas que se supone que deben alinearse no lo hacen, se destacan como un letrero de neón parpadeante.
Otras notas:
He cambiado todas las comillas invertidas a
$()
. Las comillas invertidas son obsoletas y estropean las citas, no las utilices.No es necesario exportar FILE_DT (también conocido como FDATE): la variable se perderá cuando finalice el subshell en el que se ejecuta. Solo se configurará en el shell principal si obtiene el script con
. scriptname
.