2011-05-09 88 views
1

我遇到这样的代码,它似乎使用声明-i来声明变量。我想知道为什么我们在这里使用它,而不是使用
before_datetime = date --date="$BEFORE" +%s
直接。什么用的“声明-i”

:::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),并且在读取这些变量肯定是整数的代码时将其清除。

0

只是我的2美分,你怎么能找到自己的答案。

您运行man bash和搜索部分描述declare

但是有“快”的方式。对于每一个庆典内置命令可以运行通过以下方式帮助:

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

其他人指出declare -i表示整型,但还有另外一个理由使用declare在函数中 - 它为函数创建一个局部变量(-i不是必需的,它也会添加整数属性)。这也可以使用local命令完成。

例如,在您的函数中,变量BEFORE,AFTER和TOTAL_HR都是全局变量,如果您从函数调用函数,这可能是个问题。

0

整数属性(声明-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"