Проблема в том, что вы пытаетесь выполнить замену параметра на , предшествующую имени первого позиционного параметра, на $
.
Вы можете выполнить то, что хотите:
...
elif [ $1 -lt 1000000 ]
then
arg="$1"
let arg/=1000
echo $arg" "$kilo
fi
Насколько я могу судить, вы не можете использовать позиционный параметр напрямую, сказав:
let 1/=1000
потому что это было бы синтаксической ошибкой.
Кстати, из вашего сообщения об ошибке я вижу, что $1
был установлен на 28888
. Обратите внимание, что Бэш не занимается арифметикой с плавающей точкой. Вы найдете arg
установленный на 28
(коэффициент целочисленного деления 28888 на 1000) вместо 28.888. Пожалуйста, смотрите этот замечательный вопрос-ответ о том, как делать арифметику с плавающей точкой в скриптах.
Для моих двух центов я рекомендую использовать %
модуло. Вы можете просто пройтись по списку устройств и сохранить остаток на каждом шагу. Здесь:
(
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
Единственный способ присвоить значения позиционным параметрам в bash
- использовать встроенный set
:
set a b
назначает a
до $ 1
и b
до $ 2
(обратите внимание, что он сбрасывает весь список позиционных параметров, поэтому $ 3
, $ 4
... потеряны).
Итак, здесь вы можете сделать:
set -- "$(($1 / 1000))"
Чтобы присвоить значение $ 1
, разделенное на 1000, на $ 1
.
Напротив, с zsh
(более продвинутая оболочка, подобная Bourne, не являющаяся частью проекта GNU, присутствует во всех Unix, но часто не по умолчанию), вы можете назначать индивидуальные позиционные параметры, например:
1=$(($1 / 1000))
Или:
argv[1]=$(($1 / 1000))
Или:
(( argv[1] /= 1000 ))
( $ argv
- это специальный массив, привязанный к позиционным параметрам)
Вы по-прежнему не можете сделать:
let 1/=1000
(( 1/=1000 ))
.
zsh
также поддерживает арифметику с плавающей запятой, поэтому вы можете:
((argv[1] /= 1000.))
(использование a константы с плавающей запятой (1000.) вызывает арифметику с плавающей запятой).
Вы можете отобразить его так:
printf "%.2f$kilo\n" $1