簡體   English   中英

為什么 echo "$@" 不顯示腳本名稱,但顯式迭代卻顯示?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM