Apakah ada cara untuk memeriksa apakah ada kesalahan dalam menjalankan perintah?
Contoh:
test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1
function valid () {
if $test -eq 1; then
echo "OK"
else echo "ERROR"
fi
}
Saya sudah mencoba melakukan itu tetapi tampaknya itu tidak berhasil. Saya tidak tahu bagaimana melakukannya.
command-line
moata_u
sumber
sumber
valid
) sebelum Anda menyebutnya.Jawaban:
Nilai pengembalian disimpan di
$?
. 0 menunjukkan keberhasilan, yang lain menunjukkan kesalahan.Seperti nilai tekstual lainnya, Anda dapat menyimpannya dalam variabel untuk perbandingan di masa mendatang:
Untuk kemungkinan operator perbandingan, lihat
man test
.sumber
;
sebelumelse
danfi
: `jika ...; kemudian ...; lain ...; fitest
.[ $? ]
(atau yang setara,test $?
) tidak berfungsi karena$?
dievaluasi ke nomor (0, 1, dll.) Yang bukan nol. Lihat dokumen untuktest
: "Jika EXPRESSION dihilangkan, 'test' mengembalikan false. Jika EXPRESSION adalah argumen tunggal, 'test' mengembalikan false jika argumen tersebut null dan benar sebaliknya."Jika Anda hanya perlu tahu apakah perintah itu berhasil atau gagal, jangan repot-repot menguji
$?
, cukup uji perintah secara langsung. Misalnya:Dan menugaskan output ke variabel tidak mengubah nilai kembali (well, kecuali jika berperilaku berbeda ketika stdout bukan terminal tentu saja).
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals menjelaskan
if
lebih detail.sumber
$?
melakukannya, jadi Anda salah mengatakan bahwa menguji perintah secara langsung lebih baik.local
perintah, yaitulocal foo=$(false); echo $?;
menghasilkan0
pada output. Tetapilocal
hanya relevan di dalam fungsi bash.sumber
command
mengembalikan kesalahan di layar, bagaimana cara menyembunyikannya?command
menulis kesalahan ke stderr, Anda dapat menggunakan formulircommand 2> /dev/null && echo OK || echo Failed
. The2> /dev/null
pengalihan stderr output ke/dev/null
. Namun, beberapa utilitas akan menulis kesalahan ke stdout (meskipun ini adalah praktik buruk). Dalam hal ini Anda dapat menghilangkan 2 dari pengalihan, tetapi Anda akan kehilangan output dari perintah. Metode memeriksa keberhasilan ini baik untuk logika terner sederhana tetapi untuk perilaku yang lebih kompleks, yang terbaik adalah memeriksa$?
keberhasilan perintah, atau menggunakanif
metode blok yang diuraikan dalam jawaban @ geirha.$? harus berisi status keluar dari perintah sebelumnya, yang seharusnya nol tanpa kesalahan.
Jadi, sesuatu seperti;
untuk sebagian besar kasus, lebih mudah menggunakan && membangun untuk mengaitkan perintah yang harus saling bergantung. Jadi tidak
cd /nonexistant && echo success!
akan menggemakan kesuksesan karena perintahnya rusak sebelum &&. Konsekuensi dari ini adalah ||, di mana gema akan gagal karena cd gagal. (ini menjadi berguna jika Anda menggunakan sesuatu seperti || keluar, yang akan mengakhiri skrip jika perintah sebelumnya gagal.)cd /nonexistant || echo fail
sumber
sumber
command; echo $?
?true && echo $? || echo $?
/true; echo $?
danfalse && echo $? || echo $?
/false; echo $?
- Anda akan menemukan, mereka melakukan hal yang sama persis: Dcommand && echo "success: $?" || echo "fail: $?"
Perlu dicatat bahwa
if...then...fi
dan&&
/||
jenis pendekatan berkaitan dengan status keluar yang dikembalikan oleh perintah yang ingin kami uji (0 saat berhasil); namun, beberapa perintah tidak mengembalikan status keluar yang tidak nol jika perintah gagal atau tidak dapat menangani input. Ini berarti bahwa pendekatan biasaif
dan&&
/||
tidak akan bekerja untuk perintah-perintah tertentu.Misalnya, di Linux, GNU
file
masih keluar dengan 0 jika menerima file yang tidak ada sebagai argumen danfind
tidak dapat menemukan file yang ditentukan pengguna.Dalam kasus seperti itu, salah satu cara potensial kita dapat menangani situasi adalah dengan membaca
stderr
/stdin
pesan, misalnya yang dikembalikan denganfile
perintah, atau parse output dari perintah seperti difind
. Untuk tujuan itu,case
pernyataan dapat digunakan.(Ini adalah repost jawaban saya sendiri pada pertanyaan terkait di unix.stackexchange.com )
sumber
Seperti disebutkan dalam banyak jawaban lain, tes sederhana
$?
akan dilakukan, seperti iniJika Anda ingin menguji apakah perintah gagal , Anda dapat menggunakan versi yang lebih pendek di
bash
(tapi mungkin berlebihan) sebagai berikut:Ini bekerja dengan menggunakan
(( ))
mode aritmatika, jadi jika perintah kembalisuccess
, yaitu$? = 0
tes mengevaluasi untuk((0))
tes manafalse
, jika tidak maka akan kembalitrue
.Untuk menguji kesuksesan , Anda dapat menggunakan:
tapi itu sudah tidak jauh lebih pendek dari contoh pertama.
sumber
Untuk kesalahan membuktikan perintah Anda:
Terinspirasi dalam Lean manufacturing:
sumber
if [$ (command)]; kemudian gema "berhasil"; fi
sumber
true
berhasilif [ $(true) ]; then echo "succeed"; fi
tetapisucceed
tidak dicetak. Sebenarnya ini tidak pernah memeriksa apakahcommand
berhasil. Seharusnya hanya digunakanif command
seperti dalam posting geirha .$(
)
adalah substitusi perintah .[
]
adalah ekspresi kondisional . Tidak ada pemisahan kata dan ekspansi nama file , ini pada dasarnya menguji apakahcommand
memiliki output.