Использование shell default value parameter expansion (вместе с "$*")

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

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

Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Использование shell default value parameter expansion

Сообщение sgfault »

В sh работает так:

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

$ dash  -c 'set --; echo "${*:-a}";'
a
$ dash  -c 'set -- ""; echo "${*:-a}";'
a
$


А в bash так:

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

$ bash  -c 'set --; echo "${*:-a}";'
a
$ bash  -c 'set -- ""; echo "${*:-a}";'

$

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

$ bash --posix -c 'set --; echo "${*:-a}";'
a
$ bash --posix -c 'set -- ""; echo "${*:-a}";'

$


Кто-то работает неправильно? И, я так понимаю, это bash ?

ЗЫ.

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

$ bash --version
GNU bash, version 4.2.36(1)-release (i486-pc-linux-gnu)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Использование shell default value parameter expansion

Сообщение drBatty »

sgfault писал(а):
02.11.2012 17:25
А в bash так:

во первых(help set):
-- Assign any remaining arguments to the positional parameters.
If there are no remaining arguments, the positional parameters
are unset.

потому

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

set -- "TEST"

установит все(один) параметр в TEST.
посему

Shell

$ bash -c 'set -- "TEST";echo "${*:-a}"; TEST


что непонятно? А если параметра у set нету, то параметры unset, и конструкция ${parametr:-word} возвращает word в соответствии
${parameter:-word}
Use Default Values. If parameter is unset or null, the expansion of word is substituted. Other‐
wise, the value of parameter is substituted.


ЗЫЖ а со своим недодашем разбирайтесь сами. Bash работает в соответствии с документацией, которую можно и прочитать.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Использование shell default value parameter expansion

Сообщение sgfault »

drBatty писал(а):
06.11.2012 10:23
что непонятно? А если параметра у set нету, то параметры unset, и конструкция ${parametr:-word} возвращает word в соответствии

"Что это, Бэримор?"
Другими словами, это я должен спросить: что же вы умудрились не понять на этот раз? Может, снова спецификацию не написал? Или, может, вы разучились сравнивать картинки? Тогда у меня для вас плохие новости: это тяжелый случай.

Что же касается баша, то нет, правильно работает как раз dash.
Пустое (null, не unset!):

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

$ bash -c '( set -- ""; echo "A${*}R" )'
AR

значит, тк двоеточие _стоит_, должно быть заменено на word

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

$ bash -c '( set -- ""; echo "A${*:-w}R" )'
AR

но bash его не заменяет. А вот dash заменяет

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

$ dash -c '( set -- ""; echo "A${*:-w}R" )'
AwR


_Если_бы_ у меня двоеточие _не_ стояло, то bash бы работал правильно:

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

$ bash -c '( set -- ""; echo "A${*-w}R" )'
AR
$ dash -c '( set -- ""; echo "A${*-w}R" )'
AR


или, _если_бы_ я установил _два_ пустых парметра, то тоже все работало бы правильно:

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

$ bash -c '( set -- "" ""; echo "A${*:-w}R" )'
A R
$ dash -c '( set -- "" ""; echo "A${*:-w}R" )'
A R
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Использование shell default value parameter expansion

Сообщение t.t »

Если верить abs-guide, то это таки баг в bash.
#!/bin/bash

username0=
# переменная username0 объявлена, но инициализирована "пустым" значением.
echo "username0 = ${username0-`whoami`}"
# Вывод после символа "=" отсутствует.

echo "username1 = ${username1-`whoami`}"
# Переменная username1 не была объявлена.
# Выводится имя пользователя, выданное командой `whoami`.

username2=
# переменная username2 объявлена, но инициализирована "пустым" значением.
echo "username2 = ${username2:-`whoami`}"
# Выводится имя пользователя, выданное командой `whoami`, поскольку
#+здесь употребляется конструкция ":-" , а не "-".

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

$ dash  -c 'set -- ""; echo "${*-a}";'

$ dash  -c 'set -- ""; echo "${*:-a}";'
a
$ bash  -c 'set -- ""; echo "${*-a}";'

$ bash  -c 'set -- ""; echo "${*:-a}";'


drBatty писал(а):
06.11.2012 10:23
ЗЫЖ а со своим недодашем разбирайтесь сами. Bash работает в соответствии с документацией, которую можно и прочитать.
Особенно её хорошо бы прочитать перед тем, как на неё ссылаться (выделение моё):
(man bash) писал(а):${parameter:-word}
Use Default Values. If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: