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 "/")