Satu-satunya alasan mengapa Anda ingin menggunakan $?
argumen untuk [
perintah (apakah [
perintah itu dijalankan di bagian kondisi if
pernyataan 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-list2
jika cmd-list1
berhasil atau cmd-list3
tidak.
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 cmd
gagal, itu:
if ! cmd
then ...
fi
Secara umum, Anda tidak perlu mengutak-atik $?
apalagi mengetahui nilai yang berarti true
atau 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 $IFS
kebetulan 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 bash
dan 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 ksh
sintaks 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 cd
tanpa -P
memiliki 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 false
jika cd
gagal, tetapi tidak jika <some command>
gagal).
$?
sama dengan 0 denganif
pernyataan tidak ada gunanya,if
mengharapkan perintah dan jika perintah itu kembali0
, ia menjalankan kode di blok. jadiif true; then echo hello; fi
akan menggema halo sejak perintahtrue
kembali0
.