Bash 함수에서 지역 변수를 설정하는 것이 혼란스럽습니다.
사용하는 것 같습니다
local dgt
local ltr
local braces
local da
아마 사용하는 것보다 안전할 거예요
local dgt ltr braces da
해당 변수가 지역 변수로 정의되지 않았거나, 값이 설정되어 있지 않은 것은 아닌지 걱정됩니다. 이런 일이 일어날까요?
예를 들어
local foo="$(mycmd)"
명령의 종료 상태는 지역 변수에 의해 생성된 종료 상태로 재정의됩니다.
그렇다면 올바른 코드는
local foo
foo=$(mycmd)
답변1
로컬로 정의되지 않았거나 값이 설정되지 않았습니다. 이런 일이 일어날까요?
로컬 명령 자체가 초기에 구문적으로 정확하다면 해당 명령도 정의됩니다. 로컬 명령은 로컬 명령이 평가되기 전이나 후에 발생할 수 있는 명령 대체(하위 쉘에서 실행됨)의 종료 값에 관심이 없습니다.
$ f() { local x=$(false); declare -p x; }; f; declare -p x
declare -- x=""
bash: declare: x: not found
적어도 그런 의도입니다. 그러나 버그로 인해 예상대로 작동하지 않을 수 있습니다. 특히 다음과 같은 경우에는 더욱 그렇습니다.배열 값 정의이전 버전의 Bash에서. 따라서 때로는 정의와 선언을 분리하는 것이 실제로 더 나을 수도 있습니다.
답변2
FWIW, 몇 가지 차이점은 다음과 같습니다.
$ bash -c 'f() { local a="$(exit 3)" b="$?"; echo "$b"; }; f'
3
$ bash -c 'f() { local a="$(exit 3)"; local b="$?"; echo "$b"; }; f'
0
$ bash -c 'f() { local a="$(exit 3)" á=x b="$?"; echo "$? $b"; }; f'
environment: line 0: local: `á=x': not a valid identifier
1 3
$ mksh -c 'a=0; f(){ local á; local a; a=1; }; f; echo "$a"'
mksh: typeset: á: is not an identifier
0
$ mksh -c 'a=0; f(){ local á a; a=1; }; f; echo "$a"'
mksh: typeset: á: is not an identifier
1
다른 많은 쉘과 달리 bash에서는 local
변수가 상위 범위에서 선언된 것처럼 변수를 선언하는 것을 허용하지 않습니다. readonly
그래도 local Ûnsupported¹ other_var
for, in 과 마찬가지로 in 에서 여전히 선언되는 local readonly_var other_var
것을 발견했습니다 .bash
other_var
local
1은 local Ûnsupported
실제로 에서 작동 하지만 단일 바이트로 인코딩되는 로케일 bash
에만 해당됩니다 (및 이와 같이 분류됨 ).Û
isalpha()