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) sebelum then
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 memiliki user_name
variabel (hal-hal penting). Hal yang sama berlaku untukPASS
dan pass
.
Ini juga memberi tahu Anda untuk menggunakan read -r
agar berhenti read
dari mangling \
(misalnya, penting untuk kata sandi), dan Anda harus menggandakan penawaran variabel saat menelepon sqlplus
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:
#!/bin/bash
read -r -p 'please enter username: ' user_name
IFS= read -rs -p 'please enter password: ' pass
printf 'ORACLE_SID = %s\n' "$ORACLE_SID"
sid=$ORACLE_SID
if [ "$sid" = 'Test' ]; then
echo 'Cannot copy' >&2
exit 1
fi
sqlplus -s -l "$user_name/$pass@$sid" <<'SQL_END'
copy from scott/tiger@orcl insert EMP using select * from EMP
exit
SQL_END
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 sandi read
.
Logikanya juga berubah untuk menyelamatkan jika $ORACLE_SID
/ $sid
adalah Test
. Ini menghindari memiliki bagian operasional utama skrip di if
cabang.