什么是“declare -i”的用法

时间:2011-05-09 08:18:47

标签: 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
 }

谢谢!

4 个答案:

答案 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"