У меня есть script ниже, чтобы вычесть количество файлов между двумя каталогами, но выражение 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
Вам нужно немного лишних пробелов вокруг знака "минус" и обратных ссылок:
COUNT=`expr $FIRSTV - $SECONDV`
sh
. Для переносимости, вы можете использовать этот ответ.
Попробуйте использовать этот синтаксис 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
|bc
чем пропустить ее один или два раза. Как говорится, разные штрихи для разных людей.
Для простой целочисленной арифметики вы также можете использовать встроенную команду let.
ONE=1
TWO=2
let "THREE = $ONE + $TWO"
echo $THREE
3
Для получения дополнительной информации о let
, посмотрите здесь.
В качестве альтернативы предложенным 3 методам вы можете попробовать let
, который выполняет арифметические операции над переменными следующим образом:
let COUNT=$FIRSTV-$SECONDV
или
let COUNT=FIRSTV-SECONDV