какая польза от «declare -i»

#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
  .....