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 extglobbash에만 해당됩니다( shoptbash에만 해당되며 bash두 가지 옵션 세트가 있는 유일한 셸).

extglobbashksh 확장 glob에 대한 지원을 활성화하는 옵션입니다 . ksh에서는 필요하지 않지만 ksh에서는 이러한 glob이 변수에 사용될 때 인식되지 않습니다.

printf -v확장 입니다 bash. ksh93에서는 명령 대체가 하위 쉘을 포크하지 않기 때문에 지원되지도 않고 필요하지도 않습니다. 그래서 대신:

printf -v var ...

사용

var=$(printf ...)

또는 ksh93에서:

var=${ printf ...;}

if에 대한 인수는 printf환경(예: in ${foo=bar}또는 $((n++)))을 변경해야 합니다. (그러나 후행 개행 문자는 제거됩니다.)

또한 ksh93은 ksh93과 달리 부동 소수점 연산을 지원하므로 bash이 해킹에 의존할 필요가 없습니다.

그 외에는 표시되는 오류 메시지를 설명할 수 있는 내용이 없습니다.

관련 정보