Вычесть две переменные в 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))
В качестве альтернативы предложенным 3 методам вы можете попробовать let
, который выполняет арифметические операции над переменными следующим образом:
let COUNT=$FIRSTV-$SECONDV
или
let COUNT=FIRSTV-SECONDV