Попытка присвоения не переменной?

Мы можем использовать арифметические операции внутри функции сценария оболочки:

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 

Как я могу это исправить?

3 Solutions collect form web for “Попытка присвоения не переменной?”

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

Вы можете сделать так, как хотите:

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

Насколько я могу судить, вы не можете использовать позиционный параметр напрямую, говоря:

 let 1/=1000 

потому что это будет синтаксическая ошибка.

Кстати, из вашего сообщения об ошибке, я вижу, что $1 был установлен на 28888 . Следует отметить, что Bash не выполняет арифметику с плавающей запятой. Вы найдете arg 28 (коэффициент целочисленного деления 28888 на 1000) вместо 28.888. Пожалуйста, ознакомьтесь с этим замечательным Q & A о том, как выполнять арифметику с плавающей запятой в скриптах.

Единственный способ присвоить значения позиционным параметрам в bash – через встроенный set :

 set ab 

присваивает a $1 и b до $2 (обратите внимание, что он сбрасывает список всех позиционных параметров, поэтому теряются $3 , $4 …).

Итак, вы можете сделать следующее:

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

Чтобы присвоить значение $1 деленное на 1000 до $1 .

Напротив, с zsh (более продвинутая оболочка Bourne, не являющаяся частью проекта GNU, найдена во всех Unices, хотя часто не по умолчанию), вы можете назначить отдельные позиционные параметры, такие как:

 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 

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

 ( gb=$(((mb=(kb=1024*(b=1))*kb)*kb)) #define units set -- 8934752983457 #your $1 - just a random test for u in '' kmg #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 
  • Использование eval в файле make
  • шаблон awk с переменной в скрипте bash
  • Каков наиболее эффективный способ grep для двух совершенно разных вещей и присвоения значений отдельным переменным?
  • bash - добавить пустую строку в heredoc через переменную
  • Использование «$ {a: -b}» для назначения переменных в скриптах
  • Как сохранить статус последнего выхода после теста
  • Удалить определенное слово в переменной
  • Столкновение видимых переменных переменных
  • Как вы обрабатываете несколько правил валидации при различных пользовательских вводах?
  • Переменная в команде find задана новой переменной в bash
  • Как сопоставить текст между строкой и пробелом
  • Interesting Posts

    Как LVM находит диски после установки

    Программное обеспечение для анализа файлов изображений

    Как я могу записать диск io на каждый процесс с течением времени

    В чем разница между пакетами i686 и x86_64?

    Передача файлов с помощью SSH и переключателя

    удалите строки, которые новее, чем заданная дата в файле

    Запросить страницу руководства пользователя для определенного флага

    RHEL5 – RHEL6 Обновление

    Как запустить pgpool (или любой сервис) через postgres (любой конкретный) пользователь

    Вычислить переменную и вывести ее на другую переменную

    Решение круговой зависимости ад для libX11 и libXi

    Вручную создать пароль для / etc / shadow

    Каков предпочтительный способ обновления всего программного обеспечения в установке Fedora?

    Как настроить трекпойнт, так что прокрутка посередине не является неверным истолкованием как патч среднего щелчка?

    Измените $ TERMINFO в скрипте bashrc

    Linux и Unix - лучшая ОС в мире.