我遇到这样的代码,似乎使用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
}
谢谢!
答案 0 :(得分:1)
我认为你会得到相同的结果,但-i
标志意味着变量被声明为整数(而不是字符串或其他类型)。
通过将其声明为整数,这意味着以后不必进行类型转换(例如,将字符串转换为int),并在读取这些变量绝对是整数的代码时明确说明。
答案 1 :(得分:0)
只需2美分,你就可以自己找到答案。
您运行man bash
并搜索描述declare
的部分。
然而,这是“更快”的方式。对于每个bash builtin 命令,您可以通过以下方式运行帮助:
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
.....
答案 2 :(得分:0)
其他人指出declare -i
表示一个整数,但在函数中使用declare
还有另一个原因 - 它使函数的局部变量(-i不是必需的,它还添加了整数属性)。这也可以使用local
命令完成。
例如,在函数中,变量BEFORE,AFTER和TOTAL_HR都是全局变量,如果从函数调用函数,这可能是个问题。
答案 3 :(得分:0)
整数属性(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"