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 then
trê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_name
biến (trường hợp quan trọng). Điều này cũng đúng với PASS
và pass
.
Nó cũng cho bạn biết sử dụng read -r
để ngăn chặn read
việ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ự IFS
khoả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
/ $sid
là Test
. Điều này tránh có phần hoạt động chính của tập lệnh trong một if
nhánh.