Vários modificadores de expansão de variáveis na mesma expressão

0

Por que o idioma a seguir não funciona no bash 4.1.0?

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

Aqui está no contexto ...

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
}

A saída é ...

VERSION #1
IS not circular reference
VERSION #2
    
por DocSalvager 26.02.2015 / 08:36

2 respostas

2

A documentação da expansão dos parâmetros shell diz que a sintaxe de substituição é:

${parameter/pattern/string}

Observe que a primeira parte é um parameter , não outra expressão contendo uma expansão de parâmetro. O mesmo vale para todos os outros modificadores de expansão. Você tem que fazer isso em duas etapas:

func1=${FUNCNAME:1}
if [[ ${func1/$FUNCNAME/} != ${func1} ]]
    
por 06.03.2015 / 15:45
1

Como você disse, não gosta de usar os modificadores :index e /pattern/ na mesma expressão:

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