Tengo la siguiente condición if:
STATUSFILE = "foo.status" NEWTIME=1389253927 if [ -f $STATUSFILE ] && [ expr $NEW_TIME - cat $STATUSFILE -gt 3600 ]; then echo "foo" fi;y obtengo [: demasiados argumentos
El argumento de if es un comando de Unix. [ es equivalente a test . El resultado de if depende del estado de retorno de ese comando.
Por lo tanto, si desea probar el estado de devolución de un comando, debe eliminar [ .
Cuando desee verificar la salida de un comando (no su estado), debe mantener [ y colocar el comando en $( y ) .
Su declaración debe reescribirse como:
if [ -f $STATUSFILE ] && [ $(expr $NEWTIME - $(cat $STATUSFILE)) -gt 3600 ]; then Mejor que eso es usar las capacidades aritméticas de bash, proporcionadas por $(( y )) :
if [ -f $STATUSFILE ] && [ $(($NEWTIME - $(cat $STATUSFILE) )) -gt 3600 ]; thenfoo $(expr 1 + 1) para usar la salida del comando expr 1 + 1 como argumento para el comando foo . El comando foo expr 1 + 1 simplemente ejecuta foo con las cuatro cadenas literales expr , 1 , + y 1 como sus argumentos (y no puedo imaginar una forma sensata e inequívoca de que signifique otra cosa).