Dengan skrip shell berikut, mengapa saya mendapatkan kesalahan
syntax error near unexpected token `else'
Script Shell
echo "please enter username"
read user_name
echo "please enter password"
read -s pass
echo ${ORACLE_SID}
SID=${ORACLE_SID}
if ["${ORACLE_SID}" != 'Test'] then
sqlplus -s -l $USER_NAME/$PASS@$SID <<EOF
copy from scott/tiger@orcl insert EMP using select * from EMP
exit
EOF
else
echo "Cannot copy"
fi
Jawaban:
Anda harus mengakhiri kondisi
if
seperti ini:atau seperti ini:
Catatan: Anda juga harus meletakkan spasi setelah
[
dan sebelum]
.Alasan untuk
;
atau linebreak adalah bahwa bagian kondisiif
pernyataan hanyalah sebuah perintah. Perintah apa pun dengan panjang berapa pun harus tepat. Shell mengeksekusi perintah itu, memeriksa status keluar dari perintah, dan kemudian memutuskan apakah akan mengeksekusithen
bagian atauelse
bagian.Karena perintah dapat panjang berapa pun, perlu ada penanda untuk menandai akhir dari bagian kondisi. Itu adalah
;
atau baris baru, diikuti olehthen
.Alasan spasi setelah
[
adalah karena[
merupakan perintah. Biasanya builtin dari shell. Shell mengeksekusi perintah[
dengan sisanya sebagai parameter, termasuk]
sebagai parameter terakhir yang wajib. Jika Anda tidak memberi spasi setelah[
shell akan mencoba mengeksekusi[whatever
sebagai perintah dan gagal.Alasan ruang sebelum
]
itu serupa. Karena kalau tidak maka ia tidak akan dikenali sebagai parameternya sendiri.sumber
test.sh: line 6: [: missing
] ''if
adalah sintaks, itu bukan perintah biasa. Itu kata yang dilindungi undang-undang. Tidak seperti banyak bahasa pemrograman lain, shell tidak mengenali kata-kata yang dilindungi undang-undang di mana-mana, hanya ketika mereka adalah kata pertama dari sebuah perintah (dengan beberapa seluk-beluk).if
sintaks. Saya mencoba untuk berkomunikasi bahwa kondisi bagianif
tidak dibatasi oleh bentuk tertentu oleh sintaks. Saya telah mengedit teks. Saya harap ini lebih jelas sekarang.Anda dapat dengan mudah memeriksa skrip shell menggunakan ShellCheck online (juga tersedia sebagai alat mandiri).
Dalam hal ini, ini akan menunjukkan bahwa pernyataan-if membutuhkan spasi, setelah
[
dan sebelum]
, dan bahwa Anda memerlukan a;
(atau baris baru) sebelumthen
baris yang sama.Ketika Anda sudah memperbaikinya, itu akan memberitahu Anda bahwa
USER_NAME
itu digunakan tanpa diinisialisasi dengan apa pun. Ini karena Anda juga memilikiuser_name
variabel (hal-hal penting). Hal yang sama berlaku untukPASS
danpass
.Ini juga memberi tahu Anda untuk menggunakan
read -r
agar berhentiread
dari mangling\
(misalnya, penting untuk kata sandi), dan Anda harus menggandakan penawaran variabel saat meneleponsqlplus
untuk mencegah shell secara tidak sengaja melakukan penggumpalan nama file dan pemisahan kata (sekali lagi ini penting jika kata sandi, misalnya, berisi karakter seperti globbing file*
, atau spasi).Indentasi kode akan membuatnya lebih mudah dibaca juga:
Di sini saya juga memungkinkan untuk menggunakan kata sandi dengan karakter spasi memimpin atau tertinggal dengan mengatur sementara
IFS
ke string kosong untuk membaca kata sandiread
.Logikanya juga berubah untuk menyelamatkan jika
$ORACLE_SID
/$sid
adalahTest
. Ini menghindari memiliki bagian operasional utama skrip diif
cabang.sumber
if ([ x = x ]) then (echo yes) fi
juga berfungsi.if
pernyataan dengan[ ... ]
... :-)Saat menulis
sh
Anda inginkanSaat menulis
bash
Tolong pikirkan ruangnya. Harus ada ruang antara
[[
dan operator pertama.sumber