2011-05-09 3 views
1

저는 이와 같은 코드를 만나면 변수 선언을 위해 declare -i를 사용하는 것처럼 보입니다. 나는 왜 우리가 여기 그것을 사용하는지 알기를 원한다.
before_datetime = date --date="$BEFORE" +%s
."declare -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

나만의 답변으로 혼자서 답을 찾을 수 있습니다.

man bash을 실행하고 검색 섹션에 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는 정수를 나타냅니다 지적하지만, 사용하는 또 다른 이유가있다 :

help declare 

출력은 각 bash는 다음과 같은 방법으로 도움을 실행할 수 있습니다 내장 명령 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" 
관련 문제