Satu-satunya alasan mengapa Anda ingin menggunakan $?argumen untuk [perintah (apakah [perintah itu dijalankan di bagian kondisi ifpernyataan atau tidak) adalah ketika Anda ingin membedakan status pengembalian tertentu, seperti:
until
cmd
[ "$?" -gt 1 ]
do
something
done
Sintaks untuk semua orang if, while, until... pernyataan adalah
if cmd-list1
then cmd-list2
else cmd-list3
fi
Yang berjalan cmd-list2jika cmd-list1berhasil atau cmd-list3tidak.
The [ "$?" -eq 0 ]perintah adalah no-op. Ini ditetapkan $?ke 0 jika $?adalah 0, dan $?menjadi tidak-nol jika bukan-nol.
Jika Anda ingin menjalankan sesuatu jika cmdgagal, itu:
if ! cmd
then ...
fi
Secara umum, Anda tidak perlu mengutak-atik $?apalagi mengetahui nilai yang berarti trueatau false. Satu-satunya kasus adalah seperti yang saya katakan di atas jika Anda perlu mendiskriminasikan nilai tertentu, atau jika Anda perlu menyimpannya nanti (misalnya mengembalikannya sebagai nilai pengembalian fungsi) seperti:
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
Juga ingat bahwa membiarkan variabel tidak dikutip adalah operator split + glob. Tidak masuk akal untuk memanggil operator itu di sini, jadi seharusnya:
[ "$?" -ne 0 ]
tidak [ $? -ne 0 ], apalagi [$? -ne 0 ](yang hanya akan memanggil [perintah jika $IFSkebetulan mengandung karakter pertama $?).
Perhatikan juga bahwa cara Bourne untuk mendefinisikan suatu fungsi adalah tetap function-name()di depan perintah. Itulah yang terjadi di setiap shell Bourne seperti kecuali bashdan yash(dan versi terbaru posh) yang hanya memungkinkan perintah majemuk (perintah majemuk menjadi {...}atau (...)atau hal-hal seperti for...done, if...fi...
function foo { ... }adalah kshsintaks definisi fungsi. Tidak ada alasan mengapa Anda ingin menggunakannya di sini.
Kode Anda dapat ditulis (POSIXly) dengan mudah:
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
Perhatikan juga bahwa cdtanpa -Pmemiliki makna yang sangat khusus (menangani jalur yang berisi ..komponen berbeda dari perintah lain), jadi lebih baik untuk memasukkannya ke dalam skrip untuk menghindari kebingungan.
(fungsi itu kembali falsejika cdgagal, tetapi tidak jika <some command>gagal).
$?sama dengan 0 denganifpernyataan tidak ada gunanya,ifmengharapkan perintah dan jika perintah itu kembali0, ia menjalankan kode di blok. jadiif true; then echo hello; fiakan menggema halo sejak perintahtruekembali0.