คุณสามารถตรวจสอบเชลล์สคริปต์ของคุณได้อย่างง่ายดายโดยใช้ShellCheckออนไลน์ (มีให้ในแบบสแตนด์อโลน)
ในกรณีนี้มันจะชี้ให้เห็นว่าคำสั่ง if- ต้องการช่องว่างหลัง[และก่อน]และว่าคุณต้องการ;(หรือขึ้นบรรทัดใหม่) ก่อนthenอยู่ในบรรทัดเดียวกัน
เมื่อคุณแก้ไขแล้วจะมีการแจ้งให้คุณทราบว่าUSER_NAMEมีการใช้งานโดยไม่ถูกกำหนดค่าเริ่มต้นให้กับทุกสิ่ง นี่เป็นเพราะคุณมีuser_nameตัวแปรด้วย (ตัวพิมพ์เล็ก - ใหญ่) เช่นเดียวกับPASSและpassและ
นอกจากนี้ยังบอกให้คุณใช้read -rเพื่อหยุดการreadmangling \(อาจมีความสำคัญสำหรับรหัสผ่าน) และคุณควรอ้างอิงตัวแปรเมื่อเรียกsqlplusเพื่อป้องกันเชลล์ไม่ให้ทำชื่อไฟล์กลมและแยกคำออกโดยไม่ตั้งใจ (นี่เป็นสิ่งสำคัญหาก ตัวอย่างเช่นรหัสผ่านมีอักขระตัวกลมไฟล์เช่น*หรือช่องว่าง)
การเยื้องรหัสจะทำให้อ่านง่ายขึ้นเช่นกัน:
#!/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
ที่นี่ฉันได้ทำให้มันเป็นไปได้ที่จะใช้รหัสผ่านที่มีอักขระนำหน้าหรือต่อท้ายช่องว่างโดยการตั้งค่าIFSเป็นสตริงว่างชั่วคราวสำหรับการอ่านรหัสผ่านreadเป็นสตริงว่างสำหรับการอ่านรหัสผ่าน
ตรรกะก็เปลี่ยนไปประกันตัวออกมาถ้า$ORACLE_SID/ เป็น$sid Testสิ่งนี้หลีกเลี่ยงการมีส่วนการดำเนินงานหลักของสคริปต์ในifสาขา