동일한 표현식의 여러 변수 확장 수정자

동일한 표현식의 여러 변수 확장 수정자

bash 4.1.0에서 다음 관용구가 작동하지 않는 이유는 무엇입니까?

if [[ "${FUNCNAME[*]:1/$FUNCNAME/}" != "${FUNCNAME[*]:1}" ]]

이는 맥락상...

function isCircularRef_test () {
  #
  ### Seems like this should work but it does not.
  ###   if [[ "${FUNCNAME[*]:1/$FUNCNAME/}" != "${FUNCNAME[*]:1}" ]]; then ...
  ### It appears to fail silently and exit the script so neither 'then' nor
  ### 'else' branch executes.
  ### Storing the array into a temporary string variable works. Why necessary?
  #
  printf "%s\n" "VERSION #1"
  local _fna="${FUNCNAME[*]:1}"
  if [[ "${_fna/$FUNCNAME/}" != "${_fna}" ]]
  then
    printf "%s\n" "IS circular reference"
  else
    printf "%s\n" "IS not circular reference"
  fi
  #
  printf "%s\n" "VERSION #2"
  if [[ "${FUNCNAME[*]:1/$FUNCNAME/}" != "${FUNCNAME[*]:1}" ]]
  then
    printf "%s\n" "IS circular reference"
  else
    printf "%s\n" "IS not circular reference"
  fi
}

출력은 ...

VERSION #1
IS not circular reference
VERSION #2

답변1

이것문서쉘 매개변수 확장 표현 대체 구문은 다음과 같습니다.

${parameter/pattern/string}

첫 번째 부분은 parameter매개변수 확장을 포함하는 또 다른 표현식이 아니라 입니다. 다른 모든 확장 수정자에도 동일하게 적용됩니다. 다음 두 단계로 수행해야 합니다.

func1=${FUNCNAME:1}
if [[ ${func1/$FUNCNAME/} != ${func1} ]]

답변2

말씀하신 것처럼 동일한 표현식에서 및 수정자를 사용하는 것을 좋아하지 않습니다 :index./pattern/

./t.sh: line 19: FUNCNAME[*]: 1/isCircularRef_test/: division by 0 (error token is "/")

관련 정보