The OpenNET Project / Index page

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

форумы  правила/FAQ  поиск  регистрация  вход/выход  слежка  RSS
"Не разобрался с подстановкой $@"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Не разобрался с подстановкой $@"  +/
Сообщение от Alexander7 (ok) on 08-Июл-17, 13:43 
Если несколько аргументов у скрипта, то команда с проверкой наличия строки аргументов выдаёт сообщение об ошибке

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

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

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

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

Спасибо

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

Оглавление

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


1. "Не разобрался с подстановкой $@"  +/
Сообщение от михалыч (ok) on 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

вот так!

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

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

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

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

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

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

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

[ "$1" ]


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

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

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

4. "Не разобрался с подстановкой $@"  –1 +/
Сообщение от Alexander7 (ok) on 09-Июл-17, 10:18 
> Ваша ошибка -- в рассчётах. Пожроюности - в man bash.

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

Спасибо


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

5. "Не разобрался с подстановкой $@"  +1 +/
Сообщение от Andrey Mitrofanov on 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
$ _

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

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

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

7. "Не разобрался с подстановкой $@"  +/
Сообщение от ACCA (ok) on 11-Июл-17, 19:18 
> Люди добрые, объясните пожалуйста, чего я не понял?

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

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

[ -n "$*" ]

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

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

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

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

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

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

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




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

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