我有一个shell脚本,我传递(2)参数,一个传递dbname,另一个调用(2)文件名之一。我想检查是否存在任一文件名,然后继续调用该脚本,否则退出,因为用户可以输入错误的字符串并构造我不想要的my_foo.sql
。我不认为我有条件设置"或"正确,因为放置正确的参数仍然会产生错误。有没有更好的方法来写这个?
这是我到目前为止所拥有的。
#/usr/bin/ksh
if [ $# != 2 ]; then
echo "Usage: test.sh <dbname> <test|live>" 2>&1
exit 1
fi
# Check actual file name
CHKSCRIPT1=/tmp/my_test.sql;
CHKSCRIPT2=/tmp/my_live.sql;
if [ -f "CHKSCRIPT1" ] || [ -f "CHKSCRIPT2" ]
then
/bin/sqlplus -s foo/bar @/my_$2.sql
else
echo "Correct sql script does not exist. Enter test or live"
exit 1
fi
答案 0 :(得分:3)
您的问题是您没有正确引用变量:
if [ -f "$CHKSCRIPT1" ] || [ -f "$CHKSCRIPT2" ]
...
fi
编辑:根据@chepner,您不应该使用-o
答案 1 :(得分:1)
除了扩展参数时遇到的问题,您还应该将用户输入的内容与需要存在的文件分开。如果用户输入“live”,唯一重要的是/tmp/my_live.sql
是否存在。如果用户输入“injection_attack”,则您的脚本不应执行/tmp/my_injection_attack.sql
(可能是在您不知情的情况下创建的)。正确的做法是首先验证是否输入了有效命令,然后检查是否存在相应的文件。
if [ $# != 2 ]; then
echo "Usage: test.sh <dbname> <test|live>" 2>&1
exit 1
fi
case $2 in
test|live)
filename="/tmp/my_{$2}.sql"
;;
*) echo "Must enter test or live"
exit 1
;;
esac
if [ -f "$filename" ]; then
/bin/sqlplus -s foo/bar @/my_$2.sql
else
echo "SQL script $filename does not exist."
exit 1
fi