我有一个脚本,该脚本正在从Solaris 11.3环境迁移到Oracle Linux 6.9(用于导出数据库)。在更新了各种变量和路径后,该脚本除了一个部分外,均可以正常运行。
应该执行的操作是检查其他导出的目标目录,并删除超出指示的保留设置(在本例中为1)的目录。脚本的“清理”部分运行时,可以正确识别文件,但不能删除它们,表明“预期二进制运算符”。
以下是脚本中无法正常运行的部分:
FILE_MASK="${ORACLE_SID}_*.dmp.gz"
counter=0
if [[ -f ${EXP_DIR}/${FILE_MASK} ]]; then
#
# count the files (don't use ls command because it has a limit)
#
for CNT in $EXP_DIR/$FILE_MASK
do
counter=`expr $counter + 1`
done
count=`expr $counter - $KEEP_FILES + 1`
#
counter=0
for I in $EXP_DIR/$FILE_MASK
do
counter=`expr $counter + 1`
FILE_NAME=`basename $I`
echo "${JOBNAME_SHORT}: File = ${EXP_DIR}/${FILE_NAME}"
if [[ ${counter} -lt ${count} ]] ; then
echo "${JOBNAME_SHORT}: Removing file."
rm ${EXP_DIR}/${FILE_NAME}
fi
done
返回的错误是:
/home/oracle/scripts/oraexpdp.sh:第241行:[:/u07/exports/xxxxxxxx/xxxxxxxx_2018111413.dmp.gz:需要二进制运算符
脚本的第241行是上面以“ if”开头的行。
在搜索修补程序时,曾提到将bash与双括号([[]])一起使用,但仍返回相同的错误。我需要调整什么才能使其正常工作?
非常感谢!
哈维
答案 0 :(得分:0)
[[ -f ${EXP_DIR}/${FILE_MASK} ]]
由于使用通配符bash替换将提供一组文件,因此不会评估文件是否存在。
在没有匹配文件的情况下,${EXP_DIR}/${FILE_MASK}
仍将是通配符字符串。
假设KEEP_FILES
始终为1或更大,您可以删除if [[ -f ${EXP_DIR}/${FILE_MASK} ]]
,就像没有文件的情况一样,它不会删除任何内容,因为只有通配符名称
在有多个文件的情况下,它将表现正常。