unix构造"或"文件名上的条件

时间:2014-04-24 17:06:06

标签: shell unix if-statement

我有一个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

2 个答案:

答案 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