Bash 함수의 지역 변수는 옵션 인수를 사용합니다.

Bash 함수의 지역 변수는 옵션 인수를 사용합니다.

local인수 옵션을 일치시킨 후 내 bash 함수에서 사용했습니다.

----- plist -----

local fdir=${dpath:-$PWD}
pregion "${ropts[@]}"

-----영역-----

("-d"|"--directory")
  local fdir=$2 ; shift ; shift ;;
...
# later on
: ${fdir:="${@:$#}"}

하지만 내가 여기 있을 때는 pregion

: ${fdir:="${@:$#}"}

fdir설정 중이기 때문입니다 plist.

답변1

  1. local이 함수에서 변수가 표시(읽기/쓰기)됨을 나타냅니다.그리고 그것이 호출하는 어떤 함수에서든(그리고 어떤그것들, 등).

  2. 사용하는 경우 분기에서 local-d 옵션이 전달되지 않으면 어떻게 되나요? 그러면 변수는 로컬이 아닙니다. 이것이 당신이 보는 것입니까?

더 많은 코드를 보지 않고서는 무엇을 더 제안해야 할지 모르겠습니다.

답변2

대부분의 쉘 bash에서와 마찬가지로 ¶localtypeset동적범위 지정. 함수 내에서 로컬로 선언된 변수는 해당 함수에만 로컬이거나 표시되는 것이 아닙니다.

일어나는 유일한 일은 local(함수에서 처음으로) 호출될 때 부모 범위에서 해당 변수를 숨기는 변수의 새 인스턴스가 생성되고, 함수가 반환되면 변수가 소멸되고 변수가 생성된다는 것입니다. 파괴될.아래에다시 정상으로. 변수는 다른 함수를 포함하여 변수 내에서 실행되는 모든 코드에서 계속 볼 수 있습니다.

와 함께변화 없는범위를 변경하려면 ksh93으로 전환하고( Bourne 스타일 function f { ...; }이 아닌 함수 정의 스타일을 사용하거나 f() { ...; }) zsh에 private내장된 기능을 사용해야 합니다.

$ ksh -c 'function f { typeset a=1; echo "f: $a"; g; }; function g { echo "g: $a"; }; a=0; f'
f: 1
g: 0
$ zsh -c 'zmodload zsh/param/private; f() { private a=1; echo "f: $a"; g; }; g() { echo "g: $a"; }; a=0; f'
f: 1
g: 0
$ bash -c 'f() { local a=1; echo "f: $a"; g; }; g() { echo "g: $a"; }; a=0; f'
f: 1
g: 1

in 이 부모를 어떻게 bash g보는지 , in (또는 선언된 위치 )을 확인하세요.$afksh93zshf$a 사적인g)을 호출하기 전에 전역 범위가 g표시됩니다 .$a

하지만 귀하의 경우 bash전역 범위에서 pregion생각하고 싶지 않으므로 할당을 시작하기 전에 값 없이 지역 변수를 $fdir선언하기만 하면 됩니다 .fdir

pregion() {
  local fdir # declares it unset (as long as the localvar_inherit
             # option is not set).
  ...
   ("-d"|"--directory")
     fdir=$2 ; shift ; shift ;;
  ...
  # later on
  : "${fdir=${@:$#}}"
  ...
}

또한 따옴표가 잘못된 위치에 있어서 : ${fdir:="${@:$#}"}확장이 분할+글로브의 영향을 받게 된다는 점에 유의하세요. 또한 if 에 ${var:=value}할당하는 작업 앞에는value$var$var비어 있는$var, 이전에 그랬다면 원할 수도 있습니다.설정되지 않음즉, fdir=$2위의 내용이 실행되지 않으면 구문은 입니다 ${var=value}.

여기서도 다음을 수행할 수 있습니다.

pregion() {
  local fdir="${@:$#}"
  ...
   ("-d"|"--directory")
     fdir=$2 ; shift ; shift ;;
  ...
}

즉, 무조건 마지막 위치 인수를 $fdir첫 번째 인수에 할당한 다음 -d전달되면 덮어씁니다.

보다 일반적으로는 모든 지역 변수를 사용하기 전에 지역 변수로 선언해야 하며 동적 범위가 있는 셸에서는 변수에 대한 일부 명명 규칙을 선택해야 합니다.글로벌변수가 지역 변수와 충돌하지 않도록 합니다. 모든 대문자 변수는 공통이지만 잘 알려진 변수와의 잠재적인 충돌을 고려할 수도 있습니다.환경변하기 쉬운.


1에는 조판을 통한 로컬 범위 지정을 도입한 ksh83, bash가 주로 에뮬레이트하는 셸 및 local명령을 도입한 Almquist 셸(이 경우 로컬 변수가 변수의 값과 속성을 상속하므로 다르게 작동하지만) 상위 범위가 localvar_inherit포함 됩니다. 유사한 동작을 위해 이후 버전의 bash에서)

관련 정보