$ Nedir? Bir değişken mi?


23

Soru oldukça açık. Kullanarak önceki komutun çıkış kodunu alabilirim $?. Ama bu tam olarak nedir?

Bunun bir değişken olduğunu sanmıyorum, çünkü değişken adına özel bir karakteriniz olamaz _.

foo?foo=10

hatayla sonuçlanacaktır: foo?foo=10: command not found

Öyleyse değişken değilse, nedir? Başkaları var mı?


Yanıtlar:


23

Bu ne?

$? komut, işlev veya komut dosyasının kendisinin çıkış durumunu saklayan yerleşik bir değişkendir.

$?Yürütülen son komutun çıkış durumunu okur. Bir fonksiyon döndükten sonra, fonksiyonda $?yürütülen son komutun çıkış durumunu verir. Bu, Bash'in fonksiyonlara bir "dönüş değeri" verme şeklidir. Bu döndüren 0başarı ya da aralıkta bir tamsayı üzerinde 1 - 255hata.

Başkaları da var mı?

Evet, bash'ta böyle birçok yerleşik değişken vardır. Burada bir liste görebilirsiniz . Bakınız: http://www.tldp.org/LDP/abs/html/exit-status.html


1
Yani sadece bash kabuğundaki var mı?
daltonfury42

4
@ daltonfury42 bir girişimlerde Bourne kabuğunun bazı uyumluluğuna sahip olduğu herhangi bir kabuk bunu destekler (dahil dash, ksh, zsh, diğerleri arasında).
muru

2
csh ve balık $statusaynı amaç için kullanın
glenn jackman

22

$?değişken ama özel bir karakter, bu yüzden özel karakterlere izin veriliyor. ($?)En son gerçekleştirilen ön plan boru hattının çıkış durumuna genişler.

Sadece bir tane değil, kabuk birçok parametreyi özel olarak ele alıyor. Bu parametrelere yalnızca başvuru yapılabilir; onlara atama izin verilmez:

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.

Kaynaklar:


2
"$*"sadece tek bir kelime olarak tüm konumsal parametreler değil, tüm konumsal parametreler tek bir sözcük olarak ayrılır IFS. Alıntı yapılmadığı takdirde, sonuç alan bölmeye tabi olacağından, efekt alıntılanmamış $@durumda kullanılır.
muru

1
Emin olmak için: unquoted $ @ ve $ * aynıdır, çünkü ikisi de kelimelerin bölünmesine tabidir. Belirtilen "$ @", ayrı bir parametre IFS'de bir karakter içeriyor olsa bile, konumsal parametrelerin bölme kelimesini korur.
kojiro

1
Mermilerde ne zaman kullanıldığına dair bir referans var mı? Acaba Perl bunları kabuk komut dosyalarından aldı mı?
simbabque

Bu, Perl'i on yıllarca (veya en azından yıllarca) önceden gösterir. Perl sözdiziminin çoğu kabuk sözdiziminden etkilenmiştir. (Perl 1987 doğumlu ve bu sözdizimi bir çok orijinal Bourne kabuğu (1977 geldi) Ben $ _ tanıtıldı% 100 değilim ama 1987. çok önce, neredeyse kesinlikle oldu.
Popup

6

$?a, özel bir kabuk parametresi (değişken).

Genel olarak, kullanıcı tanımlı tüm değişkenler sadece karakter sınıfından karakterleri kullanarak adlandırılmalıdır, [:alnum:]yani [a-zA-Z0-9_](ile başlayamaz [0-9]).

Özet olarak, önceki komutun çıkış kodunu sağlayan (başarılı veya başarısız) kabuğun kendisinin dahili özelliği olarak düşünülebilecek $?özel bir değişken ( ve bunlardan birkaçı vardır ).

Değişkenler hakkında daha fazla fikir edinmek için bunu okuyabilirsiniz .


4

$?bash cinsinden her zaman son çalıştırılan komutun dönüş / çıkış kodunu tutan özel bir değişkendir .

Bir terminalde çalıştırarak görüntüleyebilirsiniz echo $?.

Dönüş kodları [0; 255]. Genellikle
bir dönüş kodu 0her şeyin yolunda olduğu anlamına gelir.
Diğer değerler hataları gösterir. Çoğu uygulama döndürür 1veya özel değerler. Bir komut bulunamazsa, değişken genellikle içerir127

Bu değişkeni belirli bir değere ayarlamak istiyorsanız, bash -c "exit 5"örneğin dönüş kodunu döndürmek için bunu kolayca yapabilirsiniz 5.


Kabuk işlevi, zorunlu olarak çatal kullanmadan çıkış durumunu ayarlamak için POSIX uyumlu bir yoldur. setstatus() { return 5; }
kojiro
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.