Если несколько аргументов у скрипта, то команда с проверкой наличия строки аргументов выдаёт сообщение об ошибке[ "$@" ] - не работает, пишет "unexpected operator". Но я рассчитывал, что раз в кавычках, значит все аргументы будут просто подставлены как одна строка.
Str=$@ ; [ "$Str" ] - работает правильно.
Люди добрые, объясните пожалуйста, чего я не понял?
Проверял в sh и в bash.
Спасибо
> Если несколько аргументов у скрипта, то команда с проверкой наличия строки аргументов
> выдаёт сообщение об ошибке
> [ "$@" ] - не работает, пишет "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
вот так!
> а если серьёзно, то зачем вам это?
> что собрались протестировать? всю строку из аргументов?
> может в вашем случае можно обойтись проверкой общего количества ($#) переданных аргументовПроверка $@ появилась чисто машинально - суть аргументов скрипта в том, это текстовые данные и надо было проверить, что строка не пустая. Когда понял, что получился бред, заменил на проверку количества аргументов, т.к. аргументов может не быть, но если есть, то это не пустые строки. Практически, задача решена.
Ну вот осталось чувство глубокого не-удовлетворения от непонимания этой подстановки.
Теоретически, количество аргументов и пустая строка - это две большие разницы. И нельзя проверять наличие текста по числу аргументов, аргумент может и есть, но он пустой.
scrpt '' - аргумент один, а текста нет.Вероятно, логика разбора внутренних команд типа [ ] и echo отличается от разбора вызова внешних программ, а описания этого феномена я не нахожу.
> Если несколько аргументов у скрипта, то команда с проверкой наличия строки аргументов[ "$1" ]
> [ "$@" ]
>Но я рассчитывал,
> что раз в кавычках, значит все аргументы будут просто подставлены как
> одна строка.Ваша ошибка -- в рассчётах. Пожроюности - в man bash.
> Ваша ошибка -- в рассчётах. Пожроюности - в man bash.Безусловно, но что такое "Пожроюности" я не понял.
И где в man bash описана эта подстановка, я тоже не могу найти.
https://www.opennet.me/man.shtml?topic=bash&category=1Спасибо
>> Ваша ошибка -- в рассчётах. Пожроюности - в 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
$ _
Спасибо, чтоб я ещё понял логику Создателя!
> Люди добрые, объясните пожалуйста, чего я не понял?Две вещи:
1. $@ - это массив аргументов из командной строки, а "вся командная строка" лежит в $*
2. [ - это команда test. Ей нужен оператор, что же нужно сделатьНапиши так и будет тебе счастье:
[ -n "$*" ]
> 2. [ - это команда test. Ей нужен
> оператор, что же нужно сделатьНет, [ "$1" ] проверяет, что $1 не пуст. То же с "$*", c "$var", даже с "$foo$bar$baz".
Там выше была проблема, что $@ раскрывался в _несколько_ аргументов, а уж тут-то test/[ хотел операторов и не находил их.