недокументированная фича bash?

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

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

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

недокументированная фича bash?

Сообщение SLEDopit »

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

V=1 ; [[ V -eq 1 ]] && echo TRUE

возвращает TRUE.
Как я понимаю, вместо V подставляется 1, даже без $ перед V, потому что используется -eq.
Но нигде в документации (man, info, google) ничего подобного я не нашёл.
Забыли написать или я плохо искал?
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.
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: недокументированная фича bash?

Сообщение Lan4 »

Вместо V подставляется

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

bash: V: command not found

;)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: недокументированная фича bash?

Сообщение SLEDopit »

Lan4 писал(а): ↑
25.05.2012 22:28
Вместо V подставляется
А версия bash?
У меня 4.2.20. И подставляется именно значение.
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.
Спасибо сказали:
Аватара пользователя
yars
Сообщения: 1147
Статус: Slacker!
ОС: Slackware64-current

Re: недокументированная фича bash?

Сообщение yars »

SLEDopit писал(а): ↑
25.05.2012 22:33
А версия bash?

Интересно, у меня тоже отрабатывает как у вас, версия bash - 3.1.17(2)-release
Slackware64-current/Xfce/Xiaomi Mi Notebook Pro 15.6 | Arch Linux/Xfce/Lenovo G580
-------------
Registered Linux User #557010
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: недокументированная фича bash?

Сообщение Lan4 »

SLEDopit писал(а): ↑
25.05.2012 22:33
А версия bash?
У меня 4.2.20. И подставляется именно значение.

Такс, а как глянуть, что там подставляется?..
А, понял... Думал отмазаться тем, что

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

[[ V -eq 1 ]] && echo TRUE

тоже работает, но забыл, что перед этим V уже установлено 1. А если устанавливать 0, то работает как надо - т.е. ничего не выводит.

p.s.: про "bash: V: command not found" - это было просто предположение ;)
p.p.s.: bash 4.2.28
p.p.p.s.: все-таки фича ^^
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: недокументированная фича bash?

Сообщение watashiwa_daredeska »

SLEDopit писал(а): ↑
25.05.2012 22:25
Но нигде в документации (man, info, google) ничего подобного я не нашёл.
on the words between the [[ and ]]; tilde expansion, parameter and variable
expansion, arithmetic expansion, command substitution, process substitution, and quote removal are per‐
formed.
Arithmetic Expansion
…
The evaluation is performed according to the rules listed below under ARITHMETIC EVALUATION.
ARITHMETIC EVALUATION
…
Within an expression, shell variables may also be referenced by name without using the parameter expansion syntax.
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: недокументированная фича bash?

Сообщение Nazyvaemykh »

GNU bash 4.4.28, эта ошибка присутствует, и только с [[, но не с test.
А так это даже не ошибка, а просто такой специфический юмор.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: недокументированная фича bash?

Сообщение watashiwa_daredeska »

Nazyvaemykh писал(а): ↑
25.05.2012 23:23
эта ошибка присутствует, и только с [[, но не с test.
Это не ошибка. Так задумано. «[[» — это не тоже самое, что «[».
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: недокументированная фича bash?

Сообщение SLEDopit »

watashiwa_daredeska, спасибо.

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

$ V=V ; [[ V -eq 12 ]]
-bash: [[: V: expression recursion level exceeded (error token is "V")
эх, даже рекурсию предусмотрели :(
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.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: недокументированная фича bash?

Сообщение smaharbA »

x=1;x="x";z='x'; [[ $z -eq 1 ]] && echo 123;

яйца надо обрывать за такую предусмотрительность
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: недокументированная фича bash?

Сообщение serzh-z »

smaharbA
bash: [[: x: expression recursion level exceeded (error token is "x")


Хм, и правда.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: недокументированная фича bash?

Сообщение ZyX »

smaharbA писал(а): ↑
27.08.2012 23:57
x=1;x="x";z='x'; [[ $z -eq 1 ]] && echo 123;

яйца надо обрывать за такую предусмотрительность
Нет ничего удивительного, что у вас не получается когда вы всё делаете неправильно. Обычные переменные — это просто строки. Никакого мотива подставлять вместо строки x строку 1 у bash нет, зато есть мотив ничего не подставлять (стандарт). Но можно сделать так, чтобы мотив появился:

(Created by format.vim)

typeset -i x x=1 x=x z=x [[ z -eq 1 ]] && echo True

выведет True.

Вообще, на каком основании вы ожидали чего‐то ещё? Когда вы делаете x="x" новым значением x становится x. Откуда bash возьмёт 1 вместо x? В моём примере просто 1 подставляется вместо x на этапе присваивания, сама переменная никогда не получает значения x. В вашем bash пытается это сделать на этапе проверки, что, естественно не работает — x уже ссылается на саму себя.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: недокументированная фича bash?

Сообщение drBatty »

ZyX писал(а): ↑
01.01.2013 18:49
Нет ничего удивительного, что у вас не получается когда вы всё делаете неправильно. Обычные переменные — это просто строки. Никакого мотива подставлять вместо строки x строку 1 у bash нет, зато есть мотив ничего не подставлять (стандарт). Но можно сделать так, чтобы мотив появился:

что-бы появился мотив подставлять именно $x, можно сделать и так:

$

x=123; (( z = x )); echo $z 123


в ((двойных скобках)) тоже работает эта фича. В точности как и в [[таких скобках]].

$

x=123; [[ x -eq 123 ]] && echo True True


ZyX писал(а): ↑
01.01.2013 18:49
В вашем bash пытается это сделать на этапе проверки, что, естественно не работает — x уже ссылается на саму себя.

точнее $z содержит 'x'. А $x тут вообще не причём.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: