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