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

124

У меня есть 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
Теги:

7 ответов

144
Лучший ответ

Вам нужно немного лишних пробелов вокруг знака "минус" и обратных ссылок:

COUNT=`expr $FIRSTV - $SECONDV`
  • 2
    Этот ответ также работает в оболочке posix sh . Для переносимости, вы можете использовать этот ответ.
250

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

count=$((FIRSTV-SECONDV))

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

count=$(expr $FIRSTV - $SECONDV)

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

  • 4
    Эта форма на порядок быстрее, чем использование внешней программы expr.
  • 0
    Это работает без пробелов, но я могу знать, почему? +1 за ответ
Показать ещё 4 комментария
19

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

((count = FIRSTV - SECONDV))

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

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

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

COUNT=$(expr $FIRSTV - $SECONDV)

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

COUNT=$((FIRSTV - SECONDV))
  • 0
    синтаксическая ошибка в строке 6: неожиданное `COUNT = $ '
7

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

count=$(echo "$FIRSTV - $SECONDV"|bc)
echo $count
  • 4
    это необходимо, только если вы имеете дело с числами с плавающей запятой.
  • 2
    Я понимаю это, но я бы предпочел отлавливать эти случаи с помощью команды типа |bc чем пропустить ее один или два раза. Как говорится, разные штрихи для разных людей.
2

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

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

Для получения дополнительной информации о let, посмотрите здесь.

  • 0
    ага ... другая ссылка! ^^
  • 0
    @ another.anon.coward Ваша ссылка лучше моей +1. (... и кража ссылки)
Показать ещё 2 комментария
2

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

let COUNT=$FIRSTV-$SECONDV

или

let COUNT=FIRSTV-SECONDV

Ещё вопросы

Сообщество Overcoder
Наверх
Меню