您可以轻松地使用ShellCheck在线检查Shell脚本(也可以作为独立工具使用)。
在这种情况下,它将指出if语句在after [
和before之前需要空格,并且同一行上的if 之前]
需要一个;
(或换行符)then
。
修复该问题后,它将继续告诉您USER_NAME
已使用它而未初始化为任何东西。这是因为您也有一个user_name
变量(大小写有关)。同样是真正的PASS
和pass
。
它还告诉您使用read -r
来停止read
改写\
(例如,对于密码来说可能很重要),并且在调用时应双引号,sqlplus
以防止Shell意外进行文件名混淆和单词拆分(同样,如果例如,密码包含文件名字符,例如*
或)。
缩进代码也将使其更具可读性:
#!/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
分支中。