Linux'ta $ * ve $ # nedir?


81

Aşağıdaki ortam değişkenleri Linux'ta ne anlama geliyor?

  1. $ * (Dolar işareti ve ardından yıldız işareti) nedir?
  2. $ # Nedir (bir karma işareti / sayı işareti / octothorpe / pound işaretinin yanındaki dolar işareti)?

Yanıtlar:


112

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 .


1
Bu özel parametreler, Bourne'den türetilmiş kabukların hepsinde geçerlidir (örneğin, sh, bash, kısa çizgi, kül, ksh, zsh).
Dennis Williamson,

Düzeltme: $*ve $#1) çevre değişkenleri değil kabuk değişkenleri; 2) standardize edilmiş (POSIX şartnamesinin bir parçası)
saat

3
Ayrıca, "$@"birçok kez ${1+"$@"}(taşınabilirlik nedeniyle) yazıldığı için, açıklama için stackoverflow.com/questions/743454/… adresine bakın .
hlovdal

'Komut ismi (parametre 0) sayılmayacaktır ...' için, yukarıdaki örnekte 0'dan sayma başlayarak $ # = 2 olmalıdır
Josef Klimuk

0

$# 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

2
Süper Kullanana Hoşgeldiniz. Site bir bilgi tabanıdır, bu nedenle amaç her cevabın daha önce katkısı alınmamış bir soruya çözüm getirmesidir. Bu, yalnızca sorunun yarısını ele alır ve önceki yanıtta bilgiler zaten iyi bir şekilde ele alınmıştır.
fixer1234
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.