как по-разному ведут себя пустая строка и список с 0 элементами?

Из https: //unix.stackexchange .com / a / 94200/674

Если нет позиционных параметров ($ # равно 0), то "$ @" заменяется на ничего (не пустая строка , но список с 0 элементами )

Так как же по-разному ведут себя пустая строка и список с 0 элементами?

Означает ли «список с 0 элементами» «массив с 0 элементами» ? Я не думаю, что в bash есть понятие списка .

Может ли «ничто» означать что-то, что не обязательно является «списком» или массивом?

-2
26.07.2017, 10:19
2 ответа

Да, большинство оболочек не имеют концепции списка (для переменных ).
Это не определенный тип контента (, отдельный от строки или числа ).

Однако параметры команды представляют собой список.

Это особый тип данных, который только "$*"или "$@"можно представить в виде списка. Но с отличиями:

$ set -- one two t33
$ printf '<%s> ' "$*" ; echo
<one two t33>

$ printf '<%s> ' "$@" ; echo
<one> <two> <t33>

$ for s; do printf '<%s>' "$s" ; done; echo
<one><two><t33>

Объяснив это, кавычки означают, что список параметров с 0 элементами эквивалентен списку без элементов.

  • Короче :список исчезает (нет элементов для печати):

    $ set -- 
    $ echo $#
    0
    
    $ printf '<%s>' "$@" ; echo
    <>
    
    $ for s in "$*"; do echo "<a>" ; done
    <a>
    
    $ for s in "$@"; do echo "<a>" ; done
    $
    

Последний код не печатает «ничего», даже «пустую» (нулевую )строку.

Итак, о вашем вопросе:

Can "nothing" mean something which is not necessarily a "list" or array?

Нет, "ничего" является обязательно (пустым )"списком". Однако «нулевая строка» — это что-то.

3
28.01.2020, 05:15

По сути, $#дает вам количество параметров. 0 также является числом, указывающим на отсутствие параметров. Однако $@расширяется до нуля, что означает, что вы не можете его оценить. (например, проверьте, были ли вообще какие-либо параметры ). Попробуйте сами в скрипте и посмотрите, как он себя ведет.

Если вы хотите проверить, сколько параметров было предоставлено, например, ваш сценарий считает, что 3 обязательных параметра предоставлены -, вы должны $#.

Когда вам действительно нужно что-то сделать с параметрами, вы должны использовать $@.

См. некоторые примеры из внутренних переменных TLDP

1
28.01.2020, 05:15

Теги

Похожие вопросы