비변수에 할당해 보시겠습니까?

비변수에 할당해 보시겠습니까?

쉘 스크립트 함수에서 산술 연산을 사용할 수 있습니다.

function mess
{
   if (( "$1" > 0 )) ; then
      total=$1
   else
      total=100
   fi
   tail -$total /var/adm/messages | more
}

함수 args에 대해 산술 연산을 수행하려고 합니다.

#!/bin/bash
byte="Bytes"
kilo="KB"
mega="MB"
giga="GB"
function bytesToUnites() {
if (( "$1" < 1000 )) 
then
    echo $1" "$byte
elif (( $1 < 1000000 ))
then
    let $1/=1000
    echo $1" "$kilo
fi
}

bytesToUnites 28888

하지만 다음 오류가 발생합니다.

line 12: let: 28888/=1000: attempted assignment to non-variable (error token is "/=1000")
28888 KB

이 문제를 어떻게 해결할 수 있나요?

답변1

문제는 당신이 실행하려고한다는 것입니다매개변수 대체첫 번째 위치 매개변수 이름 앞에 $.

다음과 같이 원하는 것을 달성할 수 있습니다.

...
elif [ $1 -lt 1000000 ]
then
    arg="$1"
    let arg/=1000
    echo $arg" "$kilo
fi

내가 아는 한, 위치 매개변수를 직접 사용할 수는 없습니다.

let 1/=1000

이는 구문 오류이기 때문입니다.

그런데 오류 메시지를 보면 $1.Bash 28888는 부동 소수점 연산을 수행하지 않는다는 점에 유의해야 합니다. arg설정이 2828.888이 아닌 (28888을 정수 1000으로 나눈 몫) 이라는 것을 알 수 있습니다 . 보다이 멋진 Q&A스크립트에서 부동 소수점 연산을 수행하는 방법에 대해 설명합니다.

답변2

위치 매개변수에 값을 할당하는 유일한 방법은 내장 함수를 bash이용하는 것입니다 .set

set a b

a및 에 할당됩니다 (전체 위치 인수 목록을 재설정하므로 , ... $1이 손실됩니다).b$2$3$4

여기서는 다음과 같이 할 수 있습니다.

set -- "$(($1 / 1000))"

$11000 으로 나눈 값을 할당합니다 $1.

이와 대조적으로 zsh(GNU 프로젝트의 일부가 아닌 고급 Bourne 유사 셸을 사용하면 모든 Unices에서 사용할 수 있지만 일반적으로 기본적으로는 사용 가능하지 않음) 별도의 위치 인수를 할당할 수 있습니다. 예를 들면 다음과 같습니다.

1=$(($1 / 1000))

또는:

argv[1]=$(($1 / 1000))

또는:

(( argv[1] /= 1000 ))

( $argv위치 매개변수와 관련된 특수 배열입니다)

아직은 다음 작업을 수행할 수 없습니다.

let 1/=1000
(( 1/=1000 ))

하지만.

zsh부동 소수점 연산도 지원되므로 다음과 같이 할 수 있습니다.

((argv[1] /= 1000.))

(부동 소수점 연산을 강제하려면 부동 소수점 상수(1000.)를 사용하십시오.)

다음과 같이 표시할 수 있습니다.

printf "%.2f$kilo\n" $1

답변3

내 2센트의 경우 모듈로를 사용하는 것이 좋습니다 %. 셀 목록을 위로 이동하고 각 단계에서 나머지를 저장하면 됩니다. 여기:

(   
    gb=$(((mb=(kb=1024*(b=1))*kb)*kb))                 #define units 
    set -- 8934752983457                               #your $1 - just a random test
    for u in '' k m g                                  #this part is neat
    do  [ $((c=$1/${u}b)) -ge 1 ] || break             #math eval varnames
        [ "$u" != g ] && c=$(($c%$kb))                 #if not yet g only save %
        set -- $(($1-$c)) "$c${u}b${2:+.$2}"           #decrement $1 - build $2
    done ; shift                                       #done - toss $1
    IFS=. ; printf %s\\n $*                            #split $2 andd print
)

산출

8321gb
140mb
454kb
417b

관련 정보