将脚本从Unix迁移到Linux bash

时间:2018-11-15 16:42:06

标签: bash

我有一个脚本,该脚本正在从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与双括号([[]])一起使用,但仍返回相同的错误。我需要调整什么才能使其正常工作?

非常感谢!

哈维

1 个答案:

答案 0 :(得分:0)

[[ -f ${EXP_DIR}/${FILE_MASK} ]]由于使用通配符bash替换将提供一组文件,因此不会评估文件是否存在。

在没有匹配文件的情况下,${EXP_DIR}/${FILE_MASK}仍将是通配符字符串。

假设KEEP_FILES始终为1或更大,您可以删除if [[ -f ${EXP_DIR}/${FILE_MASK} ]],就像没有文件的情况一样,它不会删除任何内容,因为只有通配符名称

在有多个文件的情况下,它将表现正常。