[英]Why does echo “$@” not show the script name but explicit iteration does?
請考慮腳本foo.bash
#!/bin/env bash
echo "$@"
echo
for x in "${@:0:$# + 1}" ; do
echo "$x"
done
然后./foo.bash ab c
給出 output
a b c
./foo.bash
a
b
c
據我了解文檔, @
持有位置 arguments,因此echo "$@"
的 output 對我來說很有意義。
但是為什么for
循環會打印腳本名稱呢?
編輯:
我在 Windows 上使用 Git BASH, echo $BASH_VERSION
產生 4.4.23(1)-release
此行為特定於bash
4+。
按man bash
@
展開為位置參數,從一開始。 也就是說,"$@"
等價於"$1" "$2" "$3"
...
然而:
${parameter:offset:length}
Substring 擴展。 從 offset 指定的字符開始擴展到參數值的最大長度字符。 如果 parameter 是@
、以@
或*
為下標的索引數組或關聯數組名稱,則結果不同,如下所述。 如果省略長度,則擴展為參數值的 substring,從 offset 指定的字符開始並擴展到值的末尾。 長度和偏移量是算術表達式(參見下面的算術評估)。 如果 parameter 是@
,則結果是從offset
開始的length
位置參數。 如果 parameter 是由@
或*
下標的索引數組名稱,則結果是以${parameter[offset]}
開頭的數組的長度成員。
Substring 索引是從零開始的,除非使用位置參數,在這種情況下,索引默認從 1 開始。 如果
offset
為 0,並且使用了位置參數,則$0
將作為 list 的前綴。
因此,如果您使用:
"${@:0}"
這也將包括$0
但是如前所述:
"$@"
將從 position 一開始。
PS:請注意,在之前的bash
版本中,行為不同, "${@:0}"
不包括$0
。
這正是 Ksh 和 Zsh 所做的(並且子字符串/數組切片符號很可能源自 Ksh)。
$@
只給出位置參數而不是$0
的要點是它可以用於像for x in "$@"; do...
這樣的循環中。 for x in "$@"; do...
(盡管您可以只使用for x do...
)或傳遞給其他命令,如在somecmd "$@"
中,可能在一些轉移以修改列表之后。 在同一個列表中混合$0
很少有用。
但是在${@:0:n}
中,您也明確要求索引0
。 真的沒有理由不給用戶包含$0
的可能性,因為如果他們不想要它,他們可以使用$@
或${@:1}
代替。
對於常規的 arrays, ${array[0]}
是常規元素,因此自然包含在${array[@]}
和${array[@]:0}
中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.