URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9654
[ Назад ]

Исходное сообщение
"declare в Bash, целочисленные переменные и вывод списка функций"

Отправлено sick_monkey , 13-Мрт-13 15:27 
Здравствуйте.

Почитал о declare и появилось пара вопросов.
Например, declare -f выводит список функций, объявленных выше - как это можно использовать, для чего?
Объявление целочисленной переменной.
Есть ли принципиальная разница или плюсы в использовании между:
declare -i VARIAVLE=120
VARIABLE=VARIAVLE+1
и

VARIAVLE=120
VARIAVLE=$(($VARIAVLE+1))


Содержание

Сообщения в этом обсуждении
"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено Andrey Mitrofanov , 13-Мрт-13 19:14 
> Объявление целочисленной переменной.
> Есть ли принципиальная разница или плюсы в использовании между:

Принципиальня разница есть!

> declare -i VARIAVLE=120
> VARIABLE=VARIAVLE+1

^^^--- вот тут не хватает `let`

> VARIAVLE=120
> VARIAVLE=$(($VARIAVLE+1))


"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено LSTemp , 13-Мрт-13 21:16 
>> Объявление целочисленной переменной.
>> Есть ли принципиальная разница или плюсы в использовании между:
> Принципиальня разница есть!
>> declare -i VARIAVLE=120
>> VARIABLE=VARIAVLE+1
>  ^^^--- вот тут не хватает `let`

вот тут как раз let и не обязателен). ибо VARIAVLE уже заявлено как целочисленное значение:
[root@local mysql]# declare -i a=5; a=a+1; echo $a
6

>> VARIAVLE=120
>> VARIAVLE=$(($VARIAVLE+1))

В целом declare это наложение каких-то ограничений на переменную при ее определении. Дает как плюсы, так и минусы. Может рассматриваться в качестве инструмента строгого типизирования переменных (но слабого ИМХО), что обычно реализуется во всех высокоуровневых языках программирования.



"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено Andrey Mitrofanov , 13-Мрт-13 21:24 
> вот тут как раз let и не обязателен). ибо VARIAVLE уже заявлено
> как целочисленное значение:
> [root@local mysql]# declare -i a=5; a=a+1; echo $a
> 6

Ой, проверял же, вроде. :( Видимо, смотрел в другую сторону.


"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено LSTemp , 13-Мрт-13 21:51 
>> вот тут как раз let и не обязателен). ибо VARIAVLE уже заявлено
>> как целочисленное значение:
>> [root@local mysql]# declare -i a=5; a=a+1; echo $a
>> 6
> Ой, проверял же, вроде. :( Видимо, смотрел в другую сторону.

мб приколы шела? здесь же ограничений на это не давали. :D. но нативно именно так и  должно работать.


"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено sick_monkey , 14-Мрт-13 08:28 
>>> вот тут как раз let и не обязателен). ибо VARIAVLE уже заявлено
>>> как целочисленное значение:
>>> [root@local mysql]# declare -i a=5; a=a+1; echo $a
>>> 6
>> Ой, проверял же, вроде. :( Видимо, смотрел в другую сторону.
> мб приколы шела? здесь же ограничений на это не давали. :D. но
> нативно именно так и  должно работать.

Вот интересно практическое применение этого.
Есть ли смысл объявлять все переменные-счетчики и им подобные целочисленными?
Может баш меньше памяти под них выделяет или быстрее обрабатывает...
Есть ли + в производительности?


"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено sick_monkey , 14-Мрт-13 08:41 
>[оверквотинг удален]
>>>> как целочисленное значение:
>>>> [root@local mysql]# declare -i a=5; a=a+1; echo $a
>>>> 6
>>> Ой, проверял же, вроде. :( Видимо, смотрел в другую сторону.
>> мб приколы шела? здесь же ограничений на это не давали. :D. но
>> нативно именно так и  должно работать.
> Вот интересно практическое применение этого.
> Есть ли смысл объявлять все переменные-счетчики и им подобные целочисленными?
> Может баш меньше памяти под них выделяет или быстрее обрабатывает...
> Есть ли + в производительности?

Все, почитал другие Ваши ответы и разобрался
этих плюсов нет, смысл в другом.
Спасибо.


"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено Andrey Mitrofanov , 14-Мрт-13 22:50 
>> Ой, проверял же, вроде. :( Видимо, смотрел в другую сторону.
> мб приколы шела? здесь же ограничений на это не давали.

Нет. Посмотрел на работе на "тот" терминал. Смотрел туда, а вот там, куда не смотрел, была очепятка. Сам запорол проверку :S //И да, к тому же предполагал правоверный bash//


"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено LSTemp , 13-Мрт-13 21:33 
> Здравствуйте.
> Почитал о declare и появилось пара вопросов.
> Например, declare -f выводит список функций, объявленных выше - как это можно
> использовать, для чего?

например для скриптов, которые могут инклюдить пользовательские скрипты:
source скрипт_пользователя; declare -f|grep функция; если есть функция, то выполнить ее. = организация API-интерфейса для пользователя в сложных системах.

то же самое можно отнести и к динамически-генерируемым скриптам. = анализ ОС, оборудования, etc и построение исполняемого кода под конкретную платформу.

можно придумать массу применений. только заморачиваться на "придумках" в отсутствии реальной задачи вряд ли целесообразно. надо просто помнить, что возможность получения подобной информации есть, а как ее использовать - это уже дело десятое.

> Объявление целочисленной переменной.
> Есть ли принципиальная разница или плюсы в использовании между:
> declare -i VARIAVLE=120
> VARIABLE=VARIAVLE+1
> и
> VARIAVLE=120
> VARIAVLE=$(($VARIAVLE+1))


"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено LSTemp , 13-Мрт-13 21:48 
> Здравствуйте.
> Почитал о declare и появилось пара вопросов.
> Например, declare -f выводит список функций, объявленных выше - как это можно
> использовать, для чего?
> Объявление целочисленной переменной.
> Есть ли принципиальная разница или плюсы в использовании между:
> declare -i VARIAVLE=120

переменная типизирована

[root@local mysql]# declare -i v="001"; echo $v; v="zzz"; echo $v
1
0

> VARIABLE=VARIAVLE+1
> и
> VARIAVLE=120

переменная не типизирована

[root@local mysql]# v="001"; echo $v; v="zzz"; echo $v
001
zzz


> VARIAVLE=$(($VARIAVLE+1))

плюсы и минусы есть. они вполне очевидны из приведенных примеров. но только от программиста зависит, как он инструмент использует для решения своих задач.



"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено pavlinux , 14-Мрт-13 03:32 
Полезная фича, когда переменную не видно за пределами функции.

 
#!/bin/bash

function aaa() {
   VAR="pipiska"
};

aaa;
echo $VAR;

function bbb() {
   declare RAV="shlen"
}

bbb;
echo $RAV;

$ sh test.sh
pipiska



"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено LSTemp , 14-Мрт-13 05:46 
>[оверквотинг удален]
>
 
> #!/bin/bash
> function aaa() {
>    VAR="pipiska"
> };
> aaa;
> echo $VAR;
> function bbb() {
>    declare RAV="shlen"
>

local RAV="shlen"

из мана про declare:
When  used in a function, makes each name local, as with the local command.

никаких плюсов не вижу в данном случае. ИМХО пример неудачного примера.

>

 
> }
> bbb;
> echo $RAV;
>

> $ sh test.sh
> pipiska

область видимости переменной - это абсолютно другая тема.

основная фишка declare в том, что он привязывает переменным некоторые атрибуты (тип данных, readonly=const, etc). надо это или нет - каждый злобный буратино решает сам для себя.


"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено sick_monkey , 14-Мрт-13 08:37 
>[оверквотинг удален]
>> }
>> bbb;
>> echo $RAV;
>>

>> $ sh test.sh
>> pipiska
> область видимости переменной - это абсолютно другая тема.
> основная фишка declare в том, что он привязывает переменным некоторые атрибуты (тип
> данных, readonly=const, etc). надо это или нет - каждый злобный буратино
> решает сам для себя.

Спасибо.
Стало понятнее.


"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено pavlinux , 14-Мрт-13 14:47 
>local RAV="shlen"
>из мана про declare:
>When  used in a function, makes each name local, as with the local command.

Ну тогда
declare -r RAV="shlen" == readonly RAV="shlen"

> основная фишка declare в том, что он привязывает переменным некоторые атрибуты (тип
> данных, readonly=const, etc). надо это или нет - каждый злобный буратино
> решает сам для себя.

Типы "очень нужны" в безтиповом языке, не имеющего даже float.


"declare в Bash, целочисленные переменные и вывод списка функций"
Отправлено LSTemp , 17-Мрт-13 05:58 
>>local RAV="shlen"
>>из мана про declare:
>>When  used in a function, makes each name local, as with the local command.
> Ну тогда
> declare -r RAV="shlen" == readonly RAV="shlen"

и как это относится к предыдущему Вашему утверждению "Полезная фича, когда переменную не видно за пределами функции." и моему ответу на это?

>> основная фишка declare в том, что он привязывает переменным некоторые атрибуты (тип
>> данных, readonly=const, etc). надо это или нет - каждый злобный буратино
>> решает сам для себя.
> Типы "очень нужны" в безтиповом языке, не имеющего даже float.

Да не очень. Но иногда подобный подход позволяет упростить код.

К тому же кроме флага -i есть и другие полезные флаги.