Ответ 1
Например, когда оболочка korn видит my_script *, она помещает имена файлов один за другим в массив, а затем поместить массив [1] [2] [3]... в [email protected]для обработки? И, видя $*, это просто конкат filename1 + space + filename2 + space +...?
Да, в значительной степени.
Одна важная вещь для реализации здесь состоит в том, что есть два отдельных процесса: вызывающая оболочка, которая расширяет my_script *
на myscript arg1 arg2 arg3
и подпроцесс, который получает массив аргументов. Если этот подпроцесс ksh
(или sh
, bash
или аналогичная оболочка), то $*
является просто синтаксисом для "get argv [1...] как конкатенированная строка", тогда как [email protected]
является синтаксисом для "get argv [1...] как массив". Важно также отметить, что $*
и [email protected]
имеют смысл только при цитировании.
В bash, двоюродный брат ksh, эта идея переменных массива фактически была обобщена. (Возможно, ksh тоже это сделал - я не использовал ksh около десятилетия...)
В bash создается массив из 3 элементов, называемых a
. Обратите внимание, что первый элемент содержит пробел:
[~]$ a=("foo bar" baz quux)
[~]$ for i in ${a[*]}; do echo $i; done
foo
bar
baz
quux
[~]$ for i in ${a[@]}; do echo $i; done
foo
bar
baz
quux
[~]$ for i in "${a[*]}"; do echo $i; done
foo bar baz quux
[~]$ for i in "${a[@]}"; do echo $i; done
foo bar
baz
quux
Как видно из примера, "${a[*]}"
объединяет массив, а "${a[@]}"
фактически дает вам отдельные элементы.