Вопрос или проблема
У меня есть файл .sh, который содержит следующее.
Я передаю целое число в файл через $0
...
period=20000
period=period+($0*1000)
echo "$period"
...
Я пытаюсь сделать period = period + ($0 * 1000)
.
Вторая строка вызывает у меня синтаксическую ошибку, и я хочу узнать, как это сделать правильно.
Я пробовал использовать (($0*1000))
, но это не помогло.
Я также пробовал
smth=1000*$3
period=period+smth
и я получаю
20000000+1000*
Аргументы для скрипта начинаются с $1
, а не с $0
.
Для выполнения математических операций необходимо использовать арифметическое расширение:
period=20000
(( period += $1 * 1000 ))
Вы также можете использовать
period=$((period+$1*1000))
и многие другие способы.
Вы упоминаете, что $0
– это целое число (я предполагаю, вы имели в виду $1
, потому что $0
– это сам скрипт, но в любом случае), так что @choroba’s ответ отличный. Обобщая, если $1
также может быть числом с плавающей запятой, вы можете использовать bc
для выполнения вычислений, потому что $((...))
может выполнять только операции с целыми числами. Таким образом, вы можете использовать это:
period=$(echo "$period+($1*1000)" | bc)
Скобки в ($1*1000)
здесь не особо нужны, так как умножение выполняется раньше сложения, но я добавил их, чтобы ответить на ваш комментарий.
.
Ответ или решение
Для решения вашей задачи с корректной реализацией операции "period=period+($0*1000)" в shell, необходимо учесть несколько ключевых моментов.
Во-первых, важно понимать, что в shell-скрипте аргументы командной строки начинаются с $1
, а не с $0
. $0
занимает особое место, представляя имя скрипта. Следовательно, если вы хотите работать с первым аргументом, переданным вашему скрипту, используйте $1
.
Во-вторых, для выполнения математических операций в bash (шеле) используется арифметическое выражение, реализуемое с помощью (( ... ))
или $(( ... ))
. Эти конструкции поддерживают только целочисленную арифметику, но для вашего примера они как раз подходят.
Вот корректный код с использованием арифметического выражения:
period=20000
(( period += $1 * 1000 ))
echo "$period"
Иначе, если вы предпочитаете другую форму записи:
period=20000
period=$((period + $1 * 1000))
echo "$period"
Этот подход обеспечит корректное выполнение целочисленных вычислений в bash.
Если есть риск, что переданный параметр может быть числом с плавающей запятой, необходимо использовать утилиту bc
, которая поддерживает такой тип вычислений. Пример кода будет выглядеть следующим образом:
period=20000
period=$(echo "$period + ($1 * 1000)" | bc)
echo "$period"
Это решение позволит обрабатывать как целые числа, так и числа с плавающей запятой, выполняя точные расчеты.
Таким образом, правильная реализация, зависящая от типа входных данных, обеспечит достижение поставленных целей без возникновения синтаксических ошибок.
Оптимизация кода и выбор подходящих инструментов, таких как арифметическое выражение в bash или bc
для более сложных вычислений, увеличивают надежность и расширяемость вашего скрипта.