스크립트에서 bash 변수 값을 초기화하거나(메인 코드 이전) 함수의 로컬 변수에 실제 값을 할당하기 전에 초기화하는 것의 장점/단점이 있습니까?
다음과 같은 작업을 수행해야 합니까?
init()
{
name=""
name=$1
}
init "Mark"
(초기화되지 않은 경우) 쓰레기 값으로 변수를 초기화하고 변수 값에 부정적인 영향을 미칠 위험이 있습니까?
답변1
빈 문자열을 변수에 할당한 다음 즉시 다른 변수 문자열을 할당해도 이점이 없습니다. 쉘 변수에 값을 할당하면 이전 값을 완전히 덮어쓰게 됩니다.
내가 아는 한, 변수를 빈 문자열로 명시적으로 초기화해야 한다는 제안은 없습니다. 실제로 이렇게 하면 경우에 따라 오류가 가려질 수 있습니다. 아래에서 실행하면 오류가 분명해집니다 set -u
. 아래를 참조하세요.
설정되지 않았거나 스크립트가 시작된 이후 사용되지 않았거나 unset -v
명령을 실행하여 명시적으로 설정 해제된 변수에는 값이 없습니다. 그러한 변수의 값은 0이 됩니다. 으로 사용하면 "$myvariable"
동등한 을 얻게 되며 ""
"정크 데이터"는 절대 얻지 못합니다.
쉘 옵션이 또는 nounset
로 설정된 경우 설정되지 않은 변수를 참조하면 쉘에서 오류가 발생하고 비대화형 쉘이 종료됩니다.set -o nounset
set -u
$ set -u
$ unset -v myvariable
$ echo "$myvariable"
/bin/sh: myvariable: parameter not set
또는 bash
:
$ set -u
$ unset -v myvariable
$ echo "$myvariable"
bash: myvariable: unbound variable
이름이 기존 환경 변수에 해당하는 경우 쉘 변수는 환경에 의해 초기화됩니다.
환경에 의해 이런 방식으로 초기화될 수 있는 변수를 사용하려는 경우(필요하지 않은 경우) 스크립트의 주요 부분 전에 명시적으로 설정을 해제할 수 있습니다.
unset -v myvariable # unset so that it doesn't inherit a value from the environment
...이렇게 하면 환경 변수에서도 제거됩니다. 또는 단순히 초기 값을 무시하고 할당으로 덮어쓸 수도 있습니다(이렇게 하면 환경 변수의 값도 변경됩니다).
쉘 변수에서는 초기화되지 않은 쓰레기가 절대 발생하지 않습니다(위에서 언급한 것처럼 쓰레기가 동일한 이름의 환경 변수에 이미 존재하지 않는 한).
답변2
편집하다:앗, 분명히 선언은 초기화와 같지 않습니다. 어쨌든, 나와 같은 초보 프로그래머가 내 실수로부터 배울 수 있도록 여기에 남겨 두겠습니다.
함수에서 지역 변수를 선언하면 코드를 쉽게 복제할 수 있다는 장점이 있습니다.
예를 들어 다음과 같은 함수가 있다고 가정해 보겠습니다.
foo(){
local name
name="$1"
echo "$name"
}
이것을 스크립트에 작성하려면 해당 local
명령문을 무시하고 다른 모든 내용을 복사하면 됩니다.
#!/bin/bash
name="$1"
echo "$name"
선언과 할당이 같은 줄에 있으면 해당 local
섹션을 스크립트로 변환하기 전에 수동으로 편집해야 합니다.
foo(){
local name="$1"
echo "$name"
}
이 예에서는 별 문제가 아니지만 더 크고 복잡한 기능을 처리하는 경우에는 더 큰 어려움을 겪을 수 있습니다.