2011-05-09 87 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"