Apakah mungkin untuk memeriksa sintaks skrip bash tanpa menjalankannya?
Menggunakan Perl, saya bisa lari perl -c 'script name'
. Apakah ada perintah yang setara untuk skrip bash?
Apakah mungkin untuk memeriksa sintaks skrip bash tanpa menjalankannya?
Menggunakan Perl, saya bisa lari perl -c 'script name'
. Apakah ada perintah yang setara untuk skrip bash?
Jawaban:
bash -n scriptname
Mungkin peringatan yang jelas: ini memvalidasi sintaks tetapi tidak akan memeriksa apakah skrip bash Anda mencoba menjalankan perintah yang tidak ada di jalur Anda, seperti ech hello
bukan echo hello
.
set
berlaku.
if ["$var" == "string" ]
bukanif [ "$var" == "string" ]
type [
mengatakan "[adalah shell builtin". Ini akhirnya mendelegasikan ke test
program, tetapi mengharapkan braket penutupan, juga. Jadi itu seperti if test"$var"
, yang bukan apa yang dimaksud penulis, tetapi secara sintaksis valid (katakanlah $ var memiliki nilai "a", maka kita akan melihat "bash: testa: command not found"). Intinya adalah bahwa secara sintaksis, tidak ada ruang yang hilang.
[
hanya dipanggil dalam kasus ini jika $var
terjadi ekspansi ke string kosong . Jika $var
mengembang ke non-kosong string [
adalah concatenated dengan tali itu dan ditafsirkan sebagai perintah nama (tidak fungsi nama) oleh Bash, dan, ya, itu adalah sintaksis valid, tapi, seperti yang Anda negara, jelas tidak maksud. Jika Anda menggunakan [[
alih-alih [
, meskipun [[
merupakan kata kunci shell (bukan builtin), Anda akan mendapatkan hasil yang sama, karena penggabungan string yang tidak diinginkan masih mengesampingkan pengenalan kata kunci.
["$var"
secara sintaksis ekspresi nama-perintah yang valid ; demikian pula, token ==
dan argumen"$string"
perintah yang valid . (Umumnya, builtin parsing dengan perintah sintaks, sedangkan - sebagai shell kata kunci - parsing berbeda.) Shell builtin tidak tidak mendelegasikan ke " Program" (utilitas eksternal): , , , semua memiliki builtin versi kedua dan[
[[
[
test
bash
dash
ksh
zsh
[
test
, dan mereka tidak memanggil mitra utilitas eksternal mereka.
Waktu mengubah segalanya. Berikut adalah situs web yang menyediakan sintaksis online untuk memeriksa skrip shell.
Saya menemukan itu sangat kuat mendeteksi kesalahan umum.
ShellCheck adalah alat analisis dan linting statis untuk skrip sh / bash. Ini terutama berfokus pada penanganan tipikal tingkat kesalahan pemula dan menengah dan perangkap di mana shell hanya memberikan pesan kesalahan samar atau perilaku aneh, tetapi juga melaporkan beberapa masalah lebih lanjut di mana kasus sudut dapat menyebabkan kegagalan tertunda.
Kode sumber Haskell tersedia di GitHub!
apt-get install shellcheck
trusty-backports
.
Saya juga mengaktifkan opsi 'u' pada setiap skrip bash yang saya tulis untuk melakukan beberapa pemeriksaan tambahan:
set -u
Ini akan melaporkan penggunaan variabel yang tidak diinisialisasi, seperti pada skrip berikut 'check_init.sh'
#!/bin/sh
set -u
message=hello
echo $mesage
Menjalankan skrip:
$ check_init.sh
Akan melaporkan sebagai berikut:
./check_init.sh[4]: mesage: Parameter tidak disetel.
Sangat berguna untuk menangkap kesalahan ketik
set -u
walaupun ini tidak benar-benar menjawab pertanyaan, karena Anda harus menjalankan skrip untuk mendapatkan pesan kesalahan. Bahkan tidak bash -n check_init.sh
menunjukkan peringatan itu
sh -n script-name
Jalankan ini. Jika ada kesalahan sintaksis dalam skrip, maka ia mengembalikan pesan kesalahan yang sama. Jika tidak ada kesalahan, maka itu keluar tanpa memberikan pesan apa pun. Anda dapat segera memeriksa dengan menggunakan echo $?
, yang akan mengembalikan 0
konfirmasi berhasil tanpa kesalahan.
Itu bekerja dengan baik untuk saya. Saya berlari di OS Linux, Bash Shell.
sh -n
mungkin tidak akan memeriksa bahwa skrip tersebut adalah skrip Bash yang valid. Mungkin memberikan negatif palsu. sh
adalah beberapa varian shell Bourne yang biasanya bukan Bash. Misalnya di Ubuntu Linux realpath -e $(command -v sh)
memberi / bin / dash
Saya benar-benar memeriksa semua skrip bash dalam direktori saat ini untuk mengetahui kesalahan sintaksis TANPA menjalankannya menggunakan find
alat:
Contoh:
find . -name '*.sh' -exec bash -n {} \;
Jika Anda ingin menggunakannya untuk satu file, cukup edit wildcard dengan nama file tersebut.
Ada plugin BashSupport untuk IntelliJ IDEA yang memeriksa sintaksis.
.sh
atau ekstensi lain yang terkait dengan skrip Bash, yang merupakan kasus jika Anda menghasilkan skrip menggunakan beberapa alat templating seperti ERB (kemudian berakhir dengan .erb
). Silakan pilih youtrack.jetbrains.com/issue/IDEA-79574 jika Anda ingin memperbaikinya!
Jika Anda perlu dalam variabel validitas semua file dalam direktori (git pre-commit hook, build skrip lint), Anda dapat menangkap output stderr dari perintah "sh -n" atau "bash -n" (lihat lainnya jawaban) dalam suatu variabel, dan memiliki "jika / lain" berdasarkan itu
bashErrLines=$(find bin/ -type f -name '*.sh' -exec sh -n {} \; 2>&1 > /dev/null)
if [ "$bashErrLines" != "" ]; then
# at least one sh file in the bin dir has a syntax error
echo $bashErrLines;
exit;
fi
Ganti "sh" dengan "bash" tergantung kebutuhan Anda