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

Исходное сообщение
"Не разобрался с подстановкой $@"

Отправлено Alexander7 , 08-Июл-17 13:43 
Если несколько аргументов у скрипта, то команда с проверкой наличия строки аргументов выдаёт сообщение об ошибке

[ "$@" ] - не работает, пишет "unexpected operator". Но я рассчитывал, что раз в кавычках, значит все аргументы будут просто подставлены как одна строка.

Str=$@ ; [ "$Str" ] - работает правильно.

Люди добрые, объясните пожалуйста, чего я не понял?

Проверял в sh и в bash.

Спасибо


Содержание

Сообщения в этом обсуждении
"Не разобрался с подстановкой $@"
Отправлено михалыч , 08-Июл-17 18:24 
> Если несколько аргументов у скрипта, то команда с проверкой наличия строки аргументов
> выдаёт сообщение об ошибке
> [ "$@" ] - не работает, пишет "unexpected operator". Но я рассчитывал,
> что раз в кавычках, значит все аргументы будут просто подставлены как
> одна строка.
> Str=$@ ; [ "$Str" ] - работает правильно.
> Люди добрые, объясните пожалуйста, чего я не понял?
> Проверял в sh и в bash.
> Спасибо

я не понял  - чего ты не понял? ))
командный интерпретатор - он такой интерпретатор, одним словом, тот ещё фрукт,
ну вот так вот он интерпретирует ))

а если серьёзно, то зачем вам это?
ну в смысле команда [ ] - это же эквивалент команды test
что собрались протестировать? всю строку из аргументов?

может в вашем случае можно обойтись проверкой общего количества ($#) переданных аргументов
или проверкой какого-то конкретного аргумента, второго там или третьего ($2 $3)

но если сильно хочется из разряда чего-то странного, то можно так

#!/bin/sh

# ./test.sh 1 blah bla2

if [ "$(echo -n $@)" = "1 blah bla2" ] ; then
    echo OK
else
    echo BAD
fi


или, сдаётся мне, это был риторический вопрос ))
if [ $# -eq 0 ] ; then
    echo "enter the arguments"
else
    :
fi

вот так!


"Не разобрался с подстановкой $@"
Отправлено Alexander7 , 09-Июл-17 10:09 
> а если серьёзно, то зачем вам это?
> что собрались протестировать? всю строку из аргументов?
> может в вашем случае можно обойтись проверкой общего количества ($#) переданных аргументов

Проверка $@ появилась чисто машинально - суть аргументов скрипта в том, это текстовые данные и надо было проверить, что строка не пустая. Когда понял, что получился бред, заменил на проверку количества аргументов, т.к. аргументов может не быть, но если есть, то это не пустые строки. Практически, задача решена.

Ну вот осталось чувство глубокого не-удовлетворения от непонимания этой подстановки.
Теоретически, количество аргументов и пустая строка - это две большие разницы. И нельзя проверять наличие текста по числу аргументов, аргумент может и есть, но он пустой.
scrpt '' - аргумент один, а текста нет.

Вероятно, логика разбора внутренних команд типа [ ] и echo отличается от разбора вызова внешних программ, а описания этого феномена я не нахожу.


"Не разобрался с подстановкой $@"
Отправлено Andrey Mitrofanov , 09-Июл-17 10:01 
> Если несколько аргументов у скрипта, то команда с проверкой наличия строки аргументов

[ "$1" ]


> [ "$@" ]
>Но я рассчитывал,
> что раз в кавычках, значит все аргументы будут просто подставлены как
> одна строка.

Ваша ошибка -- в рассчётах. Пожроюности - в man bash.


"Не разобрался с подстановкой $@"
Отправлено Alexander7 , 09-Июл-17 10:18 
> Ваша ошибка -- в рассчётах. Пожроюности - в man bash.

Безусловно, но что такое "Пожроюности" я не понял.
И где в man bash описана эта подстановка, я тоже не могу найти.
https://www.opennet.me/man.shtml?topic=bash&category=1

Спасибо



"Не разобрался с подстановкой $@"
Отправлено Andrey Mitrofanov , 09-Июл-17 10:48 
>> Ваша ошибка -- в рассчётах. Пожроюности - в man bash.
> Безусловно, но что такое "Пожроюности" я не понял.

Я тоже.

> И где в man bash описана эта подстановка, я тоже не могу
> найти.

Так вот же:
$ man bash |grep \\\$@
       formed, with the exception of "$@" as explained below under Special Parameters.   Path‐
              is,  "$@"  is equivalent to "$1" "$2" ...  If the double-quoted expansion occurs
              ters, "$@" and $@ expand to nothing (i.e., they are removed).
       only  exceptions to this are the expansions of "$@" and "${name[@]}" as explained above
$ _


"Не разобрался с подстановкой $@"
Отправлено Alexander7 , 09-Июл-17 12:30 
Спасибо, чтоб я ещё понял логику Создателя!


"Не разобрался с подстановкой $@"
Отправлено ACCA , 11-Июл-17 19:18 
> Люди добрые, объясните пожалуйста, чего я не понял?

Две вещи:
    1. $@ - это массив аргументов из командной строки, а "вся командная строка" лежит в $*
    2. [ - это команда test. Ей нужен оператор, что же нужно сделать

Напиши так и будет тебе счастье:

[ -n "$*" ]


"Не разобрался с подстановкой $@"
Отправлено Andrey Mitrofanov , 11-Июл-17 19:48 
>     2. [ - это команда test. Ей нужен
> оператор, что же нужно сделать

Нет, [ "$1" ] проверяет, что $1 не пуст. То же с "$*", c "$var", даже с "$foo$bar$baz".

Там выше была проблема, что $@ раскрывался в _несколько_ аргументов, а уж тут-то test/[ хотел операторов и не находил их.