Özel dolar işareti kabuk değişkenleri nelerdir?


782

Bash'te, özel, tutarlı anlam değerlerine sahip birkaç değişken olduğu görülmektedir. Örneğin,

./myprogram &; echo $!

arka plandaki işlemin PID'sini döndürür myprogram. $?Şu anki TTY olduğunu düşündüğüm başkalarını da biliyorum . Başkaları var mı?


15
Bazıları sadece Bash değil. Bourne ile ilgili diğer mermilerde de kullanılırlar ve aslında POSIX tarafından belirtilirler .
sonraki duyuruya kadar duraklatıldı.

1
Peki ya: IFS = $ '\ n' Bakınız: stackoverflow.com/questions/4128235/…
sgu

1
@sgu Bu bir parametre değil; bu özel bir tür alıntıdır. $'\n'\n
digrafinin

Aradığınız buraya geldiyse ${1}, ${*}vb, parantez sadece belirsizliği azaltmak için ve çoğu zaman gereksiz. Tek başına, ${x}tam olarak eşdeğerdir $x.
tripleee

Ne anlama $!geliyor? Farkındayım !$ama değil.
Sridhar Sarnobat

Yanıtlar:


1359
  • $1, $2, $3, ... olan konumsal parametreler .
  • "$@"tüm konumsal parametrelerin dizi benzeri bir yapısıdır {$1, $2, $3 ...}.
  • "$*"tüm konumsal parametrelerin IFS genişlemesidir $1 $2 $3 ...,.
  • $# konumsal parametre sayısıdır.
  • $- kabuk için geçerli seçenekler.
  • $$ geçerli kabuk pid (alt kabuk değil).
  • $_ en son parametre (veya başlatma işleminden hemen sonra geçerli kabuğu başlatma komutunun abs yolu).
  • $IFS (giriş) alan ayırıcısıdır.
  • $? en son ön plan boru hattı çıkış durumudur.
  • $! en son arka plan komutunun PID'sidir.
  • $0 kabuk veya kabuk betiğinin adıdır.

Yukarıdakilerin çoğu Bash Referans Kılavuzunda Özel Parametreler altında bulunabilir . Kabuk tarafından ayarlanan tüm ortam değişkenleri vardır .

Kapsamlı bir dizin için lütfen Referans Kılavuz Değişken Endeksi'ne bakın .


2
Hepsi bashkılavuz sayfasında belgelenmiştir . Tek tuhaflık, $_sadece MAILPATHdeğişkente kullanımı bağlamında belirtilmiş olmasıdır .
chepner

4
@chepner , tanımının geri kalanı için Özel Parametrelerman(1) bash altına bakın . $_
kojiro

8
Ben bash betikleri !$yerine kullanıyorum $_çünkü ikincisi bazen başarısız oluyor.
amc

Güzel liste kojiro. Bu sözdizimiyle karşılaştım $ {1 + "$ @"} bu ne anlama geliyor?
user178047

3
@ amc: ve arasındaki farklar için unix.stackexchange.com/questions/271659/… adresine bakın . !$$_
tricasse

44
  • $_ son komutun son argümanı
  • $# geçerli betiğe geçirilen argüman sayısı
  • $*/ $@betiğe dize / sınırlandırılmış liste olarak iletilen bağımsız değişkenlerin listesi

kafamın üstünden. Bash özel değişkenleri için Google.


124
"Yaptım. Beni buraya gönderdiler." - Kitapçı skeçi (resmi doküman: gnu.org/software/bash/manual/bashref.html#Special-Parameters )
greggo

1
Bence $@dize ve $*ayrılmış liste (yine de yukarıdaki kabul edilen cevaba göre).
RastaJedi

1
@RastaJedi: "$@"bir listeye "$*"genişler, tek bir dizeye genişler. Uygulamanın özel davranışı $@çift ​​tırnak içinde olduğunda geçerlidir.
Keith Thompson

6
Bu çok eksiksiz veya yararlı bir cevap olmadığı için indirildi. "Google it" demek, özellikle insanların büyük çoğunluğunun burada Google aramasından kaynaklandığını düşünerek çaba göstermediğini gösterir. Bence yapabileceğiniz en az şey resmi belgelere bağlantılar eklemek. TBH, silmek için işaretlemememin tek nedeni, sorunun en azından kısmi bir cevap olmasıydı . Eski olduğunu biliyorum, ancak daha fazla ayrıntı sağlamak için lütfen düzenlemeyi düşünün.
Sean the Bean

15

Ne yaptığının anlaşılmasına yardımcı olmak için $#,$0 ve $1, ..., $nben bu senaryoyu kullanırım:

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done

Çalıştırıldığında temsili bir çıktı döndürür:

$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine

4
! İ için döngüde ne demek istiyorsun? Bu yüzden buradayım ve hiçbir yerde bir cevap bulamıyorum çünkü ona ne diyeceğimi bilmiyorum.
Anthony

7
@Anthony buna değişken dolaylama denir . Onun kullanımının iyi bir açıklamasını bash'de bulabilirsiniz : dolaylı genişleme, lütfen açıklayın? .
fedorqui 'SO' zarar vermeyi durdurun '12

3

Bazı örneklere dikkat edin; $ 0, bazı önde gelen yolları ve programın adını içerebilir. Örneğin, bu iki satır komut dosyasını ./mytry.sh kaydedin ve yürütün.

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

Çıktı:

parameter 0 --> ./mytry.sh

Bu, Bash'in şu anki (yıl 2016) versiyonunda, Slackware 14.2 aracılığıyla


5
$ 0'ın bir yol içerip içermediği, komut dosyasını nasıl çalıştırdığınıza bağlıdır. Eğer "./mytry.sh" i çalıştırırsanız 0 $ 'da görürsünüz. "~ / Mytry.sh" girdiyseniz, tam yolu görürsünüz (kabuk genişlediğinden ~). ". Mytry.sh" yaptıysanız "bash" görürsünüz.
Steve Folly
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.