The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"BASH: i=0 ; ((i++)) даёт код выхода 'шибка'. Почему?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"BASH: i=0 ; ((i++)) даёт код выхода 'шибка'. Почему?"  +/
Сообщение от Asc on 22-Апр-13, 11:27 
В BASH если переменная равна нулю, то операция инкремента имеет код выхода 1, т.е. ошибка. Если значение больше нуля, код возврата 0, т.е. успех.

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



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

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


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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

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

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

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

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

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


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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "BASH: i=0 ; ((i++)) даёт код выхода 'шибка'. Почему?"  +/
Сообщение от Andrey Mitrofanov on 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"... сложности какие

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "BASH: i=0 ; ((i++)) даёт код выхода 'шибка'. Почему?"  +/
Сообщение от pavlinux (ok) on 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    

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру