쉘 스크립트 함수에서 산술 연산을 사용할 수 있습니다.
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
설정이 28
28.888이 아닌 (28888을 정수 1000으로 나눈 몫) 이라는 것을 알 수 있습니다 . 보다이 멋진 Q&A스크립트에서 부동 소수점 연산을 수행하는 방법에 대해 설명합니다.
답변2
위치 매개변수에 값을 할당하는 유일한 방법은 내장 함수를 bash
이용하는 것입니다 .set
set a b
a
및 에 할당됩니다 (전체 위치 인수 목록을 재설정하므로 , ... $1
이 손실됩니다).b
$2
$3
$4
여기서는 다음과 같이 할 수 있습니다.
set -- "$(($1 / 1000))"
$1
1000 으로 나눈 값을 할당합니다 $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