Я был удивлен линией, отмеченной (!!) в следующем примере:
log1 () { echo [email protected]; }
log2 () { echo "[email protected]"; }
X=(a b)
IFS='|'
echo ${X[@]} # prints a b
echo "${X[@]}" # prints a b
echo ${X[*]} # prints a b
echo "${X[*]}" # prints a|b
echo "---"
log1 ${X[@]} # prints a b
log1 "${X[@]}" # prints a b
log1 ${X[*]} # prints a b
log1 "${X[*]}" # prints a b (!!)
echo "---"
log2 ${X[@]} # prints a b
log2 "${X[@]}" # prints a b
log2 ${X[*]} # prints a b
log2 "${X[*]}" # prints a|b
Вот мое понимание поведения:
-
${X[*]}и${X[@]}расширяются доa b -
"${X[*]}"расширяется до"a|b" -
"${X[@]}"расширяется до"a" "b" -
$*и[email protected]имеют то же поведение, что и${X[*]}и${X[@]}, за исключением того, что их содержимое является параметром программы или функции
Это, по-видимому, подтверждается руководством bash.
В строке log1 "${X[*]}" поэтому я ожидаю, что цитированное выражение будет расширено до "a | b", а затем будет передано функции log1. Функция имеет один строковый параметр, который он отображает. Почему происходит что-то еще?
Было бы здорово, если бы ваши ответы были поддержаны справочными/стандартными ссылками!