Bash 변수 초기화 - 요구에 따라 필수, 권장 또는 정의됩니까?

Bash 변수 초기화 - 요구에 따라 필수, 권장 또는 정의됩니까?

스크립트에서 bash 변수 값을 초기화하거나(메인 코드 이전) 함수의 로컬 변수에 실제 값을 할당하기 전에 초기화하는 것의 장점/단점이 있습니까?

다음과 같은 작업을 수행해야 합니까?

init()
{
    name=""
    name=$1
}

init "Mark"

(초기화되지 않은 경우) 쓰레기 값으로 변수를 초기화하고 변수 값에 부정적인 영향을 미칠 위험이 있습니까?

답변1

빈 문자열을 변수에 할당한 다음 즉시 다른 변수 문자열을 할당해도 이점이 없습니다. 쉘 변수에 값을 할당하면 이전 값을 완전히 덮어쓰게 됩니다.

내가 아는 한, 변수를 빈 문자열로 명시적으로 초기화해야 한다는 제안은 없습니다. 실제로 이렇게 하면 경우에 따라 오류가 가려질 수 있습니다. 아래에서 실행하면 오류가 분명해집니다 set -u. 아래를 참조하세요.

설정되지 않았거나 스크립트가 시작된 이후 사용되지 않았거나 unset -v명령을 실행하여 명시적으로 설정 해제된 변수에는 값이 없습니다. 그러한 변수의 값은 0이 됩니다. 으로 사용하면 "$myvariable"동등한 을 얻게 되며 """정크 데이터"는 절대 얻지 못합니다.

쉘 옵션이 또는 nounset로 설정된 경우 설정되지 않은 변수를 참조하면 쉘에서 오류가 발생하고 비대화형 쉘이 종료됩니다.set -o nounsetset -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"
}

이 예에서는 별 문제가 아니지만 더 크고 복잡한 기능을 처리하는 경우에는 더 큰 어려움을 겪을 수 있습니다.

관련 정보