Вычесть две переменные в Bash

у меня есть скрипт ниже, чтобы вычесть число файлов между двумя каталогами, но COUNT= выражение не работает. Каков правильный синтаксис?

#!/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

7 ответов


вам просто нужно немного дополнительных пробелов вокруг знака минуса и backticks:

COUNT=`expr $FIRSTV - $SECONDV`

имейте в виду статус выхода:

состояние выхода равно 0, если выражение не равно null или 0,1, если выражение равно null или 0.

имейте это в виду при использовании выражения в скрипте bash в сочетании с set-e который выйдет немедленно, если команда выйдет с ненулевым статусом.


попробуйте этот синтаксис Bash вместо того, чтобы пытаться использовать внешнюю программу expr:

count=$((FIRSTV-SECONDV))

кстати, правильный синтаксис использования expr - это:

count=$(expr $FIRSTV - $SECONDV)

но имейте в виду, используя expr будет медленнее, чем внутренний синтаксис Bash, который я предоставил выше.


Вы можете использовать:

((count = FIRSTV - SECONDV))

чтобы избежать вызова отдельного процесса, согласно следующей расшифровке:

pax:~$ FIRSTV=7
pax:~$ SECONDV=2
pax:~$ ((count = FIRSTV - SECONDV))
pax:~$ echo $count
5

белое пространство важно, expr ожидает, что его операнды и операторы будут отдельными аргументами. Вы также должны захватить выход. Вот так:

COUNT=$(expr $FIRSTV - $SECONDV)

но чаще всего используется встроенное арифметическое расширение:

COUNT=$((FIRSTV - SECONDV))

вот как я всегда делаю математику в Bash:

count=$(echo "$FIRSTV - $SECONDV"|bc)
echo $count

В качестве альтернативы предложенным 3 методам вы можете попробовать let, который выполняет арифметические операции над переменными следующим образом:

let COUNT=$FIRSTV-$SECONDV

или

let COUNT=FIRSTV-SECONDV


для простой целочисленной арифметики вы также можете использовать builtin пусть.

 ONE=1
 TWO=2
 let "THREE = $ONE + $TWO"
 echo $THREE
    3

подробнее о let посмотри здесь.