When I type this in bash command line
$ x=hi; printf '%s ' "$x" "${x[0]}"; echo "${_[0]}"
I have this output:
hi hi hi
"${_[0]}"
turns out to be "hi"
in the output? "x[0]"
syntax, given that "x"
is just a string
instead of an array
?The _
parameter has several meanings depending on context, but it is never an array. Likewise, in your example, x
is not an array. The reason you're able to treat it as if it is an array is that Bash allows non-array variables to be treated as if they were one-element arrays. Bash likewise allows array variables to be treated as if they were non-arrays, giving the first element.
As man bash
says:
Referencing an array variable without a subscript is equivalent to referencing the array with a subscript of 0. Any reference to a variable using a valid subscript is legal, and
bash
will create an array if necessary.
So "${_[0]}"
behaves the same as "${_}"
or "$_"
, because _
is not an array. Likewise, "${x[0]}"
behaves the same as "${x}"
or "$x"
, because x
is not an array.
As for why _
holds the value hi
: In the usage you've shown, performing parameter expansion on the special _
parameter yields the last argument of the most recent (synchronously executed) command.
As man bash
says of _
:
At shell startup, set to the absolute pathname used to invoke the shell or shell script being executed as passed in the environment or argument list. Subsequently, expands to the last argument to the previous simple command executed in the foreground, after expansion. Also set to the full pathname used to invoke each command executed and placed in the environment exported to that command. When checking mail, this parameter holds the name of the mail file currently being checked.
(emphasis mine)
In this case, the most recently executed command was:
printf '%s ' "$x" "${x[0]}"
The arguments passed to printf
were:
%s
, on which only quote removal was performed.hi
, on which parameter expansion was performed, followed by quote removal.hi
, on which a more complex form of parameter expansion yielding the same result was performed, followed by quote removal.この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加