function foo {
(cd $FOOBAR;
<some command>
if [$? -ne 0]
then
echo "Nope!"
else
echo "OK!"
fi
)
}
Saya mencoba menulis fungsi seperti di atas dan meletakkannya di file .bashrc saya. Setelah saya sumber file dan jalankan, saya mendapatkan:
Total waktu: 51 detik
-bash: [1: perintah tidak ditemukan
OK!
Adakah yang bisa membantu saya memahami kesalahan saya?
$?
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
.$?
memegang status pipa terakhir , yang bukan perintahtest
([
) dalamif
pernyataan. Contohnya adalah menguji apakahsome command
berhasil. Anda dapat melakukan hal yang sama dengan&&
dan||
, tetapi dapat membuat garis yang panjang dan tidak dapat dibaca dibandingkan denganif [ $? -eq 0 ]
. Argumen yang sama berlaku untukif some command
$?
berkembang, saya menunjukkan tidak ada gunanyatest
digunakan; karenaif some command
melakukan hal yang sama dengan satu pernyataan versus memiliki dua pernyataan terpisah. jika perintah sudah panjang, menambahkan tiga karakter tidak akan membuat 'tidak terbaca' sangat 'tidak terbaca'.Jawaban:
Tambahkan spasi setelah
[
, dan yang lain sebelum]
:[
adalah shell builtin, itu adalah perintah sepertiecho
,read
,expr
... perlu spasi setelah, dan membutuhkan pencocokan]
.Menulis
[ $? -ne 0 ]
sebenarnya memohon[
dan memberikan 4 parameter:$?
,-ne
,0
, dan]
.Catatan: fakta bahwa Anda mendapatkan pesan kesalahan
[1: command not found
berarti$?
memiliki nilai1
.sumber
[
adalah link ketest
serta[
adalah builtin shell, dan/usr/bin/[
jarang digunakan.Atau Anda bisa melewati
$?
semuanya. Jika perintah Andacmd
, berikut ini akan berfungsi:sumber
Ini praktik yang baik untuk menetapkan nilai kembali ke variabel sebelum menggunakannya
Ini memungkinkan Anda untuk menggunakan kembali nilai pengembalian. misalnya dalam pernyataan if ... elif ... else ....
sumber
[
(Tanpa spasi, itu menjadi kesalahan sintaksis dalambash
) Akan dibatalkan jika Anda mengedit dan memperbaiki kesalahan Anda.$?
secara langsung karena itu akan rusak jika Anda pernah, ketika mengedit skrip nanti, meletakkan garis antara perintah dan$?
cek.Satu-satunya alasan mengapa Anda ingin menggunakan
$?
argumen untuk[
perintah (apakah[
perintah itu dijalankan di bagian kondisiif
pernyataan atau tidak) adalah ketika Anda ingin membedakan status pengembalian tertentu, seperti:Sintaks untuk semua orang
if
,while
,until
... pernyataan adalahYang berjalan
cmd-list2
jikacmd-list1
berhasil ataucmd-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:Secara umum, Anda tidak perlu mengutak-atik
$?
apalagi mengetahui nilai yang berartitrue
ataufalse
. 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:Juga ingat bahwa membiarkan variabel tidak dikutip adalah operator split + glob. Tidak masuk akal untuk memanggil operator itu di sini, jadi seharusnya:
tidak
, apalagi[ $? -ne 0 ]
(yang hanya akan memanggil[$? -ne 0 ]
[
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 kecualibash
danyash
(dan versi terbaruposh
) yang hanya memungkinkan perintah majemuk (perintah majemuk menjadi{...}
atau(...)
atau hal-hal sepertifor...done
,if...fi
...function foo { ... }
adalahksh
sintaks definisi fungsi. Tidak ada alasan mengapa Anda ingin menggunakannya di sini.Kode Anda dapat ditulis (POSIXly) dengan mudah:
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
jikacd
gagal, tetapi tidak jika<some command>
gagal).sumber
Saya percaya perintah di bawah ini akan melakukan semua yang Anda inginkan dalam satu baris.
sumber