bash 脚本无法在 ksh 下运行

bash 脚本无法在 ksh 下运行

我有下面的脚本,如果我使用,它可以成功运行#!/usr/bin/env bash

相同的脚本正在获取寻找匹配时出现意外的 EOF"使用时出错#!/bin/ksh

这是为什么?

#!/usr/bin/env bash
#--------------------
# Command variables
#--------------------
ECHO=/usr/bin/echo
SED=/usr/bin/sed
EXPR=/usr/bin/expr
EGREP=/usr/bin/egrep
DATE=/usr/bin/date
CUT=/usr/bin/cut

#--------------------
# Local variables
#--------------------
shopt -s extglob
SHELLNAME=$(basename $0)
GRANT_RAW_AMT=''
GRANT_AMT=0
GRANT_FILE=''
FILE_BN=''
COMPANY=''
EMAIL_GRANT=''
EMAIL_RECIPIENTS=$(${ATAS_SHELL}/get_global_constant.sh RESP RESP_CASH_RECIEPT)
EMAIL_RETURN=$(${ATAS_SHELL}/get_global_constant.sh RESP CASH_RECEIPT_SENDER)
RESP_DIR=${ATAS_RESP}/$(${ATAS_SHELL}/get_global_constant.sh RESP RESPDIR)
RESP_LOG=${ATAS_RESP}/log/${0##*/}.$(/usr/bin/date +%y%m%d).$(/usr/bin/date +%H%M).log

#--------------------------------------------
#  Determine the amount of grant for the company
#--------------------------------------------
  GRANT_RAW_AMT=000078753603
  unpadded_amt=${GRANT_RAW_AMT##+(0)} # trim leading 0's -- otherwise a value that starts with
                              # 0s can be treated as octal rather than decimal.
  printf -v GRANT_AMT '%d.%02d' "$(( unpadded_amt / 100 ))" "$(( unpadded_amt % 100 ))"
  EMAIL_GRANT=${EMAIL_GRANT}${COMPANY}'\t$'${GRANT_AMT}'\n'
${ECHO} ${EMAIL_BODY1}${EMAIL_GRANT}
#--------------------------------------------
#  End of Program
#--------------------------------------------
echo >> ${RESP_LOG}
${ECHO} "${SHELLNAME} completed"
exit 0

答案1

shopt -s extglob是 bash 特定的(shopt单独是 bash 特定的,bash是唯一具有两组选项的 shell)

extglob中的选项启用bash对 ksh 扩展 glob 的支持。在 ksh 中不需要它,但请注意,在 ksh 中,这些 glob 在变量中使用时不会被识别。

printf -v是一个bash扩展。它在 ksh93 中不支持并且不需要,因为在那里,命令替换不会分叉子 shell。所以而不是:

printf -v var ...

使用

var=$(printf ...)

或在 ksh93 中:

var=${ printf ...;}

if 的参数printf应该对环境进行更改(例如 in${foo=bar}$((n++)))。 (但请注意,它会删除尾随换行符)。

另请注意,ksh93 确实支持浮点运算,与 相反bash,因此您不需要诉诸这种 hack。

除此之外,我看不到任何可以解释您收到的错误消息的内容。

相关内容