$?Bir [komuta argüman olarak kullanmak istemenizin tek nedeni (bu [komutun bir ififadenin koşul kısmında çalıştırılıp çalıştırılmamış olması ), belirli bir dönüş durumunda ayrımcılık yapmak istemenizdir:
until
cmd
[ "$?" -gt 1 ]
do
something
done
Herkes için sözdizimi if, while, until... ifadeleri ise
if cmd-list1
then cmd-list2
else cmd-list3
fi
Başarılı veya başka türlü cmd-list2çalışırsa hangisi çalışır .cmd-list1cmd-list3
[ "$?" -eq 0 ]Komut no-operasyon. $?0 ise $?0, $?sıfır değilse sıfır olarak ayarlar .
cmdBaşarısızsa bir şey çalıştırmak istiyorsanız :
if ! cmd
then ...
fi
Genel olarak, $?hangi değerin trueveya ne anlama geldiğini bilmenize izin vermenize gerek yoktur false. Belirli durumlar üzerinde ayrımcılık yapmanız gerekiyorsa veya daha sonra (örneğin, bir işlevin dönüş değeri olarak döndürmek için) kaydetmeniz gerekiyorsa, yukarıda belirtildiği gibi sadece durumlar:
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
Bir değişkeni tırnaksız bırakmanın split + glob operatörü olduğunu da unutmayın. Bu operatörü burada çağırmak mantıklı değil, bu yüzden:
[ "$?" -ne 0 ]
değil [ $? -ne 0 ], yalnız bırakın [$? -ne 0 ](bu sadece ilk karakterini içeriyorsa [komutu çağırır ).$IFS$?
Ayrıca Bourne işlevini tanımlamanın function-name()bir komutun önüne geçmektir. Yani hariç kabuğu gibi her Bourne durum bashve yash(ve son sürümlerinde poshyalnızca bileşik komutu (bileşik komutları olmanın izin) {...}veya (...)ya da benzeri şeyler for...done, if...fi...
function foo { ... }bir kshfonksiyon tanımlama sözdizimi. Burada kullanmak istemenizin bir nedeni yok.
Kodunuz taşınabilir (POSIXly) yazılabilir:
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
Dikkat edilmesi gereken cdolmadan -Pçok özel bir anlam içermemelidir (kolları yolları vardır ..başka komutu farklı bileşenler), bu önlemek karışıklıklar komut dahil etmek daha iyidir bu yüzden.
( başarısız olursa bu işlev geri döner falseancak cdbaşarısız olmazsa döndürür <some command>).
$?isimli bir ile 0'a eşitifaçıklamada, anlamsızifbir komut bekler ve eğer komut döner dedi0, bu blok içinde kod çalışır. böyleceif true; then echo hello; fikomut yankı olacaktır merhaba beritruedöndü0.