Как правильно выполнить это “period=period+($0*1000)” в shell?

Вопрос или проблема

У меня есть файл .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 для более сложных вычислений, увеличивают надежность и расширяемость вашего скрипта.

Оцените материал
Добавить комментарий

Капча загружается...