Я был удивлен линией, отмеченной (!!)
в следующем примере:
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. Функция имеет один строковый параметр, который он отображает. Почему происходит что-то еще?
Было бы здорово, если бы ваши ответы были поддержаны справочными/стандартными ссылками!