У меня есть сценарий ниже, чтобы вычесть количество файлов между двумя каталогами, но 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
Ответы:
Вам просто нужно немного лишних пробелов вокруг знака минус и обратных галочек:
Будьте в курсе статуса выхода:
Статус выхода равен 0, если EXPRESSION не равен ни нулю, ни 0, 1, если EXPRESSION равен нулю, или 0 .
Помните об этом при использовании выражения в скрипте bash в сочетании с set -e, который немедленно завершится, если команда завершится с ненулевым статусом.
источник
sh
оболочке posix . Для переносимости, вы можете использовать этот ответ.Попробуйте использовать синтаксис Bash вместо использования внешней программы
expr
:Кстати, правильный синтаксис использования
expr
:Но имейте в виду, что использование
expr
будет медленнее, чем внутренний синтаксис Bash, который я предоставил выше.источник
$(command)
синтаксис для подстановки команд. Также, поскольку BASH поддерживает арифметические операции$(( ... ))
, лучше не использовать внешнюю утилитуexpr
$(( ... ))
используется для оценки арифметических выражений.Ты можешь использовать:
чтобы избежать вызова отдельного процесса, согласно следующей расшифровке:
источник
Пробел важен,
expr
его операнды и операторы ожидаются как отдельные аргументы. Вы также должны захватить вывод. Как это:но чаще используется встроенное арифметическое расширение:
источник
Вот как я всегда делаю математику в Bash:
источник
|bc
команды type, чем пропустить ее один или два раза. Как говорится, разные штрихи для разных людей.Для простой целочисленной арифметики вы также можете использовать встроенную команду let .
Для получения дополнительной информации
let
, смотрите здесь .источник
let "sanity_check_duration=sanity_check_duration_end_time_delay_sec - sanity_check_duration_start_time_delay_sec"
(удаление знака доллара из переменных)В качестве альтернативы предлагаемым 3 методам вы можете попробовать
let
выполнить арифметические операции над переменными следующим образом:let COUNT=$FIRSTV-$SECONDV
или
let COUNT=FIRSTV-SECONDV
источник
Используйте Python:
Вывод
источник