題 Linux中的$ *和$#是什麼?


Linux中的以下環境變量是什麼意思?

  1. 什麼是$ *(美元符號後跟星號)?
  2. 什麼是$#(哈希標記旁邊的美元符號/數字符號/ octothorpe /英鎊符號)?

75
2018-02-17 18:53


起源




答案:


這裡

$#    Stores the number of command-line arguments that 
      were passed to the shell program.
$?    Stores the exit value of the last command that was 
      executed.
$0    Stores the first word of the entered command (the 
      name of the shell program).
$*    Stores all the arguments that were entered on the
      command line ($1 $2 ...).
"$@"  Stores all the arguments that were entered
      on the command line, individually quoted ("$1" "$2" ...).

基本上, $# 是腳本執行時給出的一些參數。 $* 是包含所有參數的字符串。例如, $1 是第一個參數,依此類推。如果要訪問腳本中的特定參數,這很有用。

正如Brian評論的那樣,這是一個簡單的例子。如果運行以下命令:

./command -yes -no /home/username
  • $# = 3
  • $* = -yes -no /home/username
  • $@ =數組: {"-yes", "-no", "/home/username"}
  • $0 = ./command$1 = -yes 等等

這些是。的一部分 POSIX標準,並且應該由所有兼容的shell支持。作為參考,下面是每個特殊參數的POSIX標准定義。請注意,還有三個額外的變量: $-$$ 和 $!

$@

從一個開始擴展到位置參數。當擴展發生在雙引號內,並且字段分裂時(參見 場分裂執行時,每個位置參數應作為單獨的字段擴展,條件是第一個參數的擴展仍應與原始單詞的開頭部分連接(假設擴展參數嵌入在單詞中),並且最後一個參數的擴展仍然應與原始單詞的最後一部分連接。如果沒有位置參數,“@”的擴展將產生零字段,即使“@”是雙引號。

$*

從一個開始擴展到位置參數。當擴展發生在雙引號字符串中時(參見 雙引號),它將擴展為單個字段,每個參數的值由IFS變量的第一個字符分隔,或者由IFS取消設置。如果IFS設置為空字符串,則不等於取消設置;它的第一個字符不存在,因此參數值是連接的。

$#

擴展為位置參數的十進制數。命令名(參數0)不應計入'#'給出的數字,因為它是一個特殊參數,而不是位置參數。

$?

擴展到最近管道的十進制退出狀態(請參閱 管道)。

$-

(連字符。)擴展到調用時指定的當前選項標誌(單字母選項名稱連接成一個字符串)  特殊的內置命令,或由shell隱式命令。

$$

擴展為調用的shell的十進制進程ID。在子shell中(參見 Shell執行環境 ),'$'將擴展為與當前shell相同的值。

$!

擴展為最近的後台命令的十進制進程ID(請參閱 清單)從當前shell執行。 (例如,從子shell執行的後台命令不會影響當前shell環境中“$!”的值。)對於管道,進程ID是管道中最後一個命令的ID。

$0

(零。)擴展為shell或shell腳本的名稱。看到 SH 有關如何派生此名稱的詳細說明。


105
2018-02-17 18:59



這些特殊參數在所有Bourne派生的shell中都是正確的(例如sh,bash,dash,ash,ksh,zsh)。 - Dennis Williamson
更正: $* 和 $# 1)shell變量,而不是環境變量; 2)標準化(POSIX規範的一部分) - grawity
還要注意 "$@" 很多次寫成 ${1+"$@"} (出於便攜性原因),請參閱 stackoverflow.com/questions/743454/... 作出解釋。 - hlovdal
由於'命令名稱(參數0)不計算...',在上面的例子中應該是$#= 2,從0開始計數。 - Josef Klimuk


$# 表示參數的數量:

[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3

0
2017-09-24 05:34



歡迎來到超級用戶。該網站是一個知識庫,因此意圖是每個答案都提供了尚未提供的問題的解決方案。這只解決了問題的一半,並且在上一個答案中已經很好地介紹了這些信息。 - fixer1234