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

Исходное сообщение
"BASH: i=0 ; ((i++)) даёт код выхода 'шибка'. Почему?"

Отправлено Asc , 22-Апр-13 11:27 
В BASH если переменная равна нулю, то операция инкремента имеет код выхода 1, т.е. ошибка. Если значение больше нуля, код возврата 0, т.е. успех.

Зачем так сделано, как это обычно используется? Где конкретно описано, что именно искать в манах?



bash
i=0 ; ((i++)) ; echo $?
i=3 ; ((i++)) ; echo $?

Причём вот это даёт ноль на выходе:


i=0 ; ((i+=1)) ; echo $?


Содержание

Сообщения в этом обсуждении
"BASH: i=0 ; ((i++)) даёт код выхода 'шибка'. Почему?"
Отправлено Andrey Mitrofanov , 22-Апр-13 11:43 
> В BASH если переменная равна нулю, то операция инкремента имеет код выхода
> 1, т.е. ошибка.

"Традиционно", _в_Си_ логичесикий false - это _ровно 0_, true - всё, что !=0.
Не менее традиционно, коды возврата в шелах юниксов (и -подобных): 0=OK, !=ошибка.

Вооот. А теметь в шеле (второй случай) образоваваются Си-подобные выражения и логические значения (первый случай). Мозги вывихиваются, да.

> Если значение больше нуля, код возврата 0, т.е. успех.

Не "больше", а "не равно".

> Зачем так сделано, как это обычно используется? Где конкретно описано, что именно
> искать в манах?

Ну-у-у... Применять здравый (=Си-программерский) смысл к man bash до исправления вывиха мозга, наверное.


>i=0 ; ((i++)) ; echo $?
> Причём вот это даёт ноль на выходе:
>i=0 ; ((i+=1))

Если ты сравнишь пост-инкремент и +=1 _по_правилам_Си, то наверное, узнаешь, почему значение на выходе разное.


"BASH: i=0 ; ((i++)) даёт код выхода 'шибка'. Почему?"
Отправлено pavlinux , 23-Апр-13 15:30 
> Если ты сравнишь пост-инкремент и +=1 _по_правилам_Си, то наверное, узнаешь, почему значение
> на выходе разное.

У операций ваще нет кодов и особо выхода, у них результат.
Да и ваще, проверять сам факт работы операции, это предел паранои. :)
Хотя эта фича используется при доказательстве теоремы Ферма.


"BASH: i=0 ; ((i++)) даёт код выхода 'шибка'. Почему?"
Отправлено Andrey Mitrofanov , 23-Апр-13 16:28 
>> Если ты сравнишь пост-инкремент и +=1 _по_правилам_Си, то наверное, узнаешь, почему значение
>> на выходе разное.
> У операций ваще нет кодов и особо выхода, у них результат.

Ты меня не путай! Раз есть рез-т, значит, оно закончилось. Раз закончилось, значит вышло.

Выход есть!

> Да и ваще, проверять сам факт работы операции, это предел паранои. :)

Случай всякий может быть.

N=5; while let N--; do echo "#$N"; done

Оно же "while((N--))". А также в if-ах, || / && конвейерах (или как их там //pipeline), ... и, наверное, везде, где можно использовать код выхода.

++ну привык я так, к кальке в Eng.: exit code и всё тут.
--посмотрел man bash, "exit status", "return status", также "status", "non-zero status", местами "return a status", "return an {error,exit} status"... сложности какие


"BASH: i=0 ; ((i++)) даёт код выхода 'шибка'. Почему?"
Отправлено pavlinux , 23-Апр-13 23:38 
>> Да и ваще, проверять сам факт работы операции, это предел паранои. :)
> Случай всякий может быть.
> N=5; while let N--; do echo "#$N"; done

Я тебе не о том. А о проверке работы операторов +, - , *, /, %, и т.д  
По теории - Проверку истиности парадигм одного языка, НЕЛЬЗЯ сделать средствами этого же языка.

Например констукция:  if (if (if (if (if (a == 3)) == true) != false) == 0 ) != 1 ) - безполезна,
так как мы не можем проверить самый последний if