#shell
#оболочка
Вопрос:
я встречаю подобный код, кажется, он использует declare -i для объявления переменной . я хочу знать, почему мы используем это здесь, а не используем
before_datetime = date --date="$BEFORE" %s
напрямую .
:::shell
get_timestamp() {
BEFORE=$1
AFTER=$2
TOTAL_HR=$3
BEFORE=$(echo $BEFORE)
AFTER=$(echo $AFTER)
declare -i before_datetime=`date --date="$BEFORE" %s`
declare -i after_datetime=`date --date="$AFTER" %s`
declare -i date_total_s=$(($after_datetime-$before_datetime))
date_hr=$(echo "scale=5; $date_total_s/60/60" | bc -l)
TOTAL_HR=$(echo "scale=5; $TOTAL_HR $date_hr" | bc -l)
echo $TOTAL_HR
}
Спасибо!
Ответ №1:
Я думаю, вы получите тот же результат, но -i
флаг означает, что переменная объявлена как целое число (а не как строка или другой тип).
Объявляя это как целое число, это означает, что в дальнейшем не нужно выполнять приведение типа (например, преобразование строки в int), и просто дает понять при чтении кода, что эти переменные определенно являются целыми числами.
Ответ №2:
Другие указывали, что declare -i
указывает на целое число, но есть другая причина использовать declare
в функции — это делает переменную локальной для функции (для этого -i не требуется, оно также добавляет свойство integer). Это также можно сделать с помощью local
команды.
Например, в вашей функции переменные BEFORE, AFTER и TOTAL_HR являются глобальными, что может быть проблемой, если вы вызываете функции из функций.
Ответ №3:
Целочисленный атрибут (declare -i)
Наличие целочисленного атрибута для переменной изменяет способ работы операторов =
и =
.
=
Оператор
От man bash
:
Если для переменной установлен целочисленный атрибут, то значение вычисляется как арифметическое выражение, даже если расширение $ ((…)) не используется.
Пример:
i=1 2
declare -i j=1 2
echo "With integer attribute unset: $i" # Returns "1 2"
echo "With integer attribute set: $j" # Returns "3"
=
Оператор
От man bash
:
[…] оператор = может использоваться для добавления к предыдущему значению переменной. Когда = применяется к переменной, для которой был установлен целочисленный атрибут, значение вычисляется как арифметическое выражение и добавляется к текущему значению переменной, которое также вычисляется. […] При применении к переменной со строковым значением значение расширяется и добавляется к значению переменной
Пример:
i=1
declare -i j=1
i =2
j =2
echo "With integer attribute unset: $i" # Returns "12"
echo "With integer attribute set: $j" # Returns "3"
Ответ №4:
Просто мои 2 цента, как вы могли бы найти ответ самостоятельно.
Вы запускаете man bash
и выполняете поиск в разделе, описывающем declare
.
Однако есть «более быстрый» способ. Для каждой встроенной команды bash вы можете запустить справку следующим образом:
help declare
Вывод таков:
.......
Options which set attributes:
-a to make NAMEs indexed arrays (if supported)
-A to make NAMEs associative arrays (if supported)
-i to make NAMEs have the `integer' attribute
-l to convert NAMEs to lower case on assignment
.....