Подстановка переменной в операции с плавающей запятой

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
Disova
Сообщения: 59
ОС: Debian, CentOS

Подстановка переменной в операции с плавающей запятой

Сообщение Disova »

Код: Выделить всё

#!/bin/bash

percent=0
time_left=270

until [ $time_left -eq 0  ]; do

        echo "Выполнено $percent %"
        percent=`echo 'scale = 2; $time_left / 270 * 100' | bc`
        echo "Осталось $time_left сек."
        time_left=`expr $time_left - 1`
        sleep 1

done


Есть такой цикл где на каждую секунду высчитывается процент выполнения и выводится в обратном порядке на экран.
У меня строке

Код: Выделить всё

percent=`echo 'scale = 2; $time_left / 270 * 100' | bc
возникает ошибка

Код: Выделить всё

(standard_in) 1: illegal character: $

Если написать обычную цифру то все работает.
Объясните как правильно подставить туда переменную, если это возможно?
ride it you way
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20791
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Подстановка переменной в операции с плавающей запятой

Сообщение Bizdelnick »

Disova писал(а):
13.08.2013 19:19
У меня строке

Не закрыт `
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Disova
Сообщения: 59
ОС: Debian, CentOS

Re: Подстановка переменной в операции с плавающей запятой

Сообщение Disova »

Bizdelnick писал(а):
13.08.2013 19:25
Disova писал(а):
13.08.2013 19:19
У меня строке

Не закрыт `


это опечатка. Все равно не работает.
ride it you way
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Подстановка переменной в операции с плавающей запятой

Сообщение SLEDopit »

Disova писал(а):
13.08.2013 19:19
Объясните как правильно подставить туда переменную, если это возможно?
Т.к. вы используйте одинарные кавычки, переменная не подставляется, а передаётся в bc как есть.
Либо замените кавычки на двойные, либо поставьте ещё одни одинарные кавычки до и после переменной:

Код: Выделить всё

percent=`echo "scale = 2; $time_left / 270 * 100" | bc`
percent=`echo 'scale = 2; '$time_left' / 270 * 100' | bc`
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Disova
Сообщения: 59
ОС: Debian, CentOS

Re: Подстановка переменной в операции с плавающей запятой

Сообщение Disova »

SLEDopit писал(а):
13.08.2013 19:28
Т.к. вы используйте одинарные кавычки, переменная не подставляется, а передаётся в bc как есть.
Либо замените кавычки на двойные, либо поставьте ещё одни одинарные кавычки до и после переменной:

Код: Выделить всё

percent=`echo "scale = 2; $time_left / 270 * 100" | bc`
percent=`echo 'scale = 2; '$time_left' / 270 * 100' | bc`


Спасибо, все работает. Если можете объясните пожалуйста почему это работает с вариантом '$time_left'?
С двойными кавычками вроде все понятно.
ride it you way
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Подстановка переменной в операции с плавающей запятой

Сообщение SLEDopit »

Disova писал(а):
13.08.2013 19:36
Если можете объясните пожалуйста почему это работает с вариантом '$time_left'?
Потому что одинарные кавычки экранируют всё, кроме, собственно, одинарных кавычек. Поэтому экранирование начинается на 'scale', а потом перед переменной вы его заканчиваете, и переменная успешно заменяется на своё значение, а после переменной вы снова включаете экранирование.
Из-за подобной особенности, чтобы в такую строку вставить одинарную кавычку приходится пользоваться трюком:

Код: Выделить всё

'string '\'' end'
ну или

Код: Выделить всё

"string ' end"
, хотя иногда бывают ситуации, когда первый вариант использовать проще.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Disova
Сообщения: 59
ОС: Debian, CentOS

Re: Подстановка переменной в операции с плавающей запятой

Сообщение Disova »

SLEDopit писал(а):
13.08.2013 19:44
Потому что одинарные кавычки экранируют всё, кроме, собственно, одинарных кавычек. Поэтому экранирование начинается на 'scale', а потом перед переменной вы его заканчиваете, и переменная успешно заменяется на своё значение, а после переменной вы снова включаете экранирование.
Из-за подобной особенности, чтобы в такую строку вставить одинарную кавычку приходится пользоваться трюком:

Код: Выделить всё

'string '\'' end'
ну или

Код: Выделить всё

"string ' end"
, хотя иногда бывают ситуации, когда первый вариант использовать проще.


Вроде понял :)
ride it you way
Спасибо сказали:
Ответить