Tengo el script a continuación para restar los recuentos de archivos entre dos directorios, pero la COUNT=
expresión no funciona. ¿Cual es la sintaxis correcta?
#!/usr/bin/env bash
FIRSTV=`ls -1 | wc -l`
cd ..
SECONDV=`ls -1 | wc -l`
COUNT=expr $FIRSTV-$SECONDV ## -> gives 'command not found' error
echo $COUNT
Respuestas:
Solo necesita un poco de espacio en blanco adicional alrededor del signo menos y teclas de retroceso:
Tenga en cuenta el estado de salida:
El estado de salida es 0 si EXPRESSION no es nulo ni 0, 1 si EXPRESSION es nulo o 0 .
Tenga esto en cuenta cuando use la expresión en un script bash en combinación con set -e que se cerrará inmediatamente si un comando sale con un estado distinto de cero.
fuente
sh
shell. Para la portabilidad, es posible que desee utilizar esta respuesta.Pruebe esta sintaxis de Bash en lugar de intentar usar un programa externo
expr
:Por cierto, la sintaxis correcta de uso
expr
es:Pero tenga en cuenta que el uso
expr
será más lento que la sintaxis interna de Bash que proporcioné anteriormente.fuente
$(command)
sintaxis para la sustitución de comandos. Además, dado que BASH admite operaciones aritméticas$(( ... ))
, es mejor no usar una utilidad externaexpr
$(( ... ))
se usa para evaluar expresiones aritméticas.Puedes usar:
para evitar invocar un proceso separado, según la siguiente transcripción:
fuente
El espacio en blanco es importante,
expr
espera que sus operandos y operadores sean argumentos separados. También tienes que capturar la salida. Me gusta esto:pero es más común usar la expansión aritmética integrada:
fuente
Así es como siempre hago matemáticas en Bash:
fuente
|bc
comando de tipo que omitirlo una o dos veces. Diferentes golpes para diferentes personas como dicen.Para la aritmética de enteros simples, también puede usar el comando let incorporado .
Para más información sobre
let
, mira aquí .fuente
let "sanity_check_duration=sanity_check_duration_end_time_delay_sec - sanity_check_duration_start_time_delay_sec"
(eliminando el signo de dólar de las variables)Como alternativa a los 3 métodos sugeridos, puede probar
let
que realiza operaciones aritméticas en variables de la siguiente manera:let COUNT=$FIRSTV-$SECONDV
o
let COUNT=FIRSTV-SECONDV
fuente
Utiliza Python:
Salida
fuente