Yanıtlar:
Gönderen burada :
$# 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" ...).
Yani, temel olarak, $#senaryonuzun çalıştırıldığı zaman verilen bir takım argümanlardır. $*Tüm değişkenleri içeren bir dizedir. Örneğin $1, ilk argüman vb. Komut dosyanızdaki belirli bir argümana erişmek istiyorsanız, bu kullanışlıdır.
Brian'ın dediği gibi, basit bir örnek. Aşağıdaki komutu çalıştırırsanız:
./command -yes -no /home/username
$# = 3$* = -yes -no /home/username$@ = dizi: {"-yes", "-no", "/home/username"}$0= ./command, $1= -yesvb.Bunlar POSIX standardının bir parçasıdır ve tüm uyumlu mermiler tarafından desteklenmelidir. Referans için, aşağıda her özel parametre için POSIX standart tanımları verilmiştir. Not mı orada üç ek değişkenler var: $-, $$ve $!.
$@:
Birinden başlayarak konumsal parametrelere genişler. Genişleme çift tırnak içinde gerçekleştiğinde ve alan bölmenin (bkz. Alan Bölme ) gerçekleştirildiği yerlerde, her bir konum parametresi ayrı bir alan olarak genişler, birinci parametrenin genişlemesinin hala başlangıç bölümüyle birleştirilmesi şartıyla Orijinal kelime (genişletilmiş parametrenin bir kelimenin içine gömülmüş olduğu varsayılarak) ve son parametrenin genişlemesi, yine de orijinal kelimenin son kısmı ile birleştirilmelidir. Konumsal parametreler yoksa, '@' genişlemesi, '@' çift tırnaklı olsa bile sıfır alan oluşturur.
$*:
Birinden başlayarak konumsal parametrelere genişler. Genişleme, çift tırnaklı bir dizgide gerçekleştiğinde (bkz. Çift Tırnaklar ), IFS değişkeninin ilk karakteriyle veya IFS ayarlanmamışsa, her parametrenin değeri ile tek bir alana genişleyecektir. Eğer IFS boş bir dizgeye ayarlanmışsa, bu onu ayarlamaya eşit değildir; ilk karakteri bulunmadığından parametre değerleri birleştirilir.
$#:
Ondalık konumsal parametre sayısına genişler. Komut adı (parametre 0) '#' ile verilen sayıda sayılmaz, çünkü bu konumsal bir parametre değil özel bir parametredir.
$?:
En son boru hattının ondalık çıkış durumuna genişler (bkz. Boru Hatları ).
$-:
(Tire). Tarafından, çağırma belirtilen akım seçenek bayrakların (bir dize halinde birleştirilmiş tek harfli seçenek adları) genişler seti yerleşik komutu veya dolaylı kabuk tarafından special.
$$:
Çağrılan kabuğun ondalık işlem kimliğine genişler. Bir alt kabukta (bkz. Kabuk Uygulama Ortamı ), '$' geçerli kabuğunkiyle aynı değere genişleyecektir.
$!:
Geçerli kabuktan yürütülen en son arka plan komutunun ondalık işlem kimliğine (bkz. Listeler ) genişler . (Örneğin, alt kabuklardan yürütülen arka plan komutları, geçerli kabuk ortamında "$!" Değerini etkilemez.) Bir boru hattı için işlem kimliği, boru hattındaki son komutunkidir.
$0:
(Sıfır.) Kabuk veya kabuk komut dosyasının adına genişler. Bu adın nasıl türetildiği ile ilgili ayrıntılı bir açıklama için sh bölümüne bakınız .
$*ve $#1) çevre değişkenleri değil kabuk değişkenleri; 2) standardize edilmiş (POSIX şartnamesinin bir parçası)
"$@"birçok kez ${1+"$@"}(taşınabilirlik nedeniyle) yazıldığı için, açıklama için stackoverflow.com/questions/743454/… adresine bakın .
$# argüman sayısını gösterir:
[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1
[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3