Bạn có thể dễ dàng kiểm tra các tập lệnh shell của mình bằng ShellCheck trực tuyến (cũng có sẵn dưới dạng một công cụ độc lập).
Trong trường hợp này, nó sẽ chỉ ra rằng câu lệnh if cần khoảng trắng, sau [và trước ]và rằng bạn cần một ;(hoặc một dòng mới) trước dòng thentrên cùng một dòng.
Khi bạn đã sửa nó, nó sẽ tiếp tục cho bạn biết rằng nó USER_NAMEđược sử dụng mà không được khởi tạo cho bất cứ thứ gì. Điều này là do bạn cũng có một user_namebiến (trường hợp quan trọng). Điều này cũng đúng với PASSvà pass.
Nó cũng cho bạn biết sử dụng read -rđể ngăn chặn readviệc xáo trộn \(ví dụ có thể quan trọng đối với mật khẩu) và rằng bạn nên trích dẫn gấp đôi các biến khi gọi sqlplusđể ngăn shell vô tình thực hiện việc tách tên tệp và tách từ (một lần nữa điều này rất quan trọng nếu mật khẩu, ví dụ, chứa các ký tự toàn cầu tập tin như *hoặc khoảng trắng).
Việc thụt mã sẽ giúp nó dễ đọc hơn:
#!/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
Ở đây tôi cũng đã cho phép sử dụng mật khẩu với các ký tự IFSkhoảng trắng ở đầu hoặc cuối bằng cách đặt tạm thời thành một chuỗi trống để đọc mật khẩu read.
Logic cũng được thay đổi để bảo lãnh nếu $ORACLE_SID/ $sidlà Test. Điều này tránh có phần hoạt động chính của tập lệnh trong một ifnhánh.