Google no me ayudó.
#!/bin/sh
j1=`expr "$1"`
j2=`expr "$2"`
while [ $j1 -le $j2 ]; do
date=$(ncal -e $j1)
month=$($date | cut -f1 -d' ')
if [ $month=="April" ]; then
echo $date
fi
j1=`expr $j1 + 1`
done
Quiero imprimir la fecha de Semana Santa solo para los años en los que está en el mes de abril (en el rango entre los dos años que pasé como argumentos). Pero de alguna manera obtengo el resultado:
...
April 5 2015
./script.sh: 8: March: not found
March 27 2016
./script.sh: 8: April: not found
April 16 2017
¿Qué significa "mes: no encontrado"? ¿Y por qué imprime marzo aunque solo pido abril?
Lo intenté de varias maneras y siempre hubo algún error.
También necesito agregar la condición de que solo se impriman aquellas fechas que sean posteriores al 20 de abril, pero ni siquiera puedo manejar esto.
Respuesta1
En la línea
month=$($date | cut -f1 -d' ')
ejecuta lo que sea que esté $date
como comando y canaliza su salida a cut
.
creo que quieres
month=$( printf '%s\n' "$date" | cut -f 1 -d ' ' )
aquí.
Además, no mezcle comillas invertidas y $(...)
en el mismo guión, es confuso. Solo úsalo $(...)
en su lugar.
La comparación de cadenas se realiza con =
:
if [ "$month" = "April" ]; then
Asegúrese de citar dos veces sus variables. VerImplicaciones de seguridad de olvidarse de citar una variable en shells bash/POSIX
La aritmética de números enteros se puede hacer usando $(( expression ))
. expr
es anticuado.
j1=$(( "$1" ))
j2=$(( "$2" ))
...
j1=$(( j1 + 1 ))