Предпринятое присвоение на непеременную?

lmsensors должен добиться цели?

https://wiki.archlinux.org/index.php/Lm_sensors

6
03.08.2014, 23:18
3 ответа

Проблема в том, что вы пытаетесь выполнить замену параметра на , предшествующую имени первого позиционного параметра, на $.

Вы можете выполнить то, что хотите:

...
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. Пожалуйста, смотрите этот замечательный вопрос-ответ о том, как делать арифметику с плавающей точкой в скриптах.

6
27.01.2020, 20:25

Для моих двух центов я рекомендую использовать % модуло. Вы можете просто пройтись по списку устройств и сохранить остаток на каждом шагу. Здесь:

(   
    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
)

OUTPUT

8321gb
140mb
454kb
417b
0
27.01.2020, 20:25

Единственный способ присвоить значения позиционным параметрам в 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
3
27.01.2020, 20:25

Теги

Похожие вопросы