$?
Bir [
komuta argüman olarak kullanmak istemenizin tek nedeni (bu [
komutun bir if
ifadenin 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-list1
cmd-list3
[ "$?" -eq 0 ]
Komut no-operasyon. $?
0 ise $?
0, $?
sıfır değilse sıfır olarak ayarlar .
cmd
Başarısızsa bir şey çalıştırmak istiyorsanız :
if ! cmd
then ...
fi
Genel olarak, $?
hangi değerin true
veya 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 bash
ve yash
(ve son sürümlerinde posh
yalnızca bileşik komutu (bileşik komutları olmanın izin) {...}
veya (...)
ya da benzeri şeyler for...done
, if...fi
...
function foo { ... }
bir ksh
fonksiyon 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 cd
olmadan -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 false
ancak cd
başarısız olmazsa döndürür <some command>
).
$?
isimli bir ile 0'a eşitif
açıklamada, anlamsızif
bir komut bekler ve eğer komut döner dedi0
, bu blok içinde kod çalışır. böyleceif true; then echo hello; fi
komut yankı olacaktır merhaba beritrue
döndü0
.