Bash 변수 초기화-필요하거나 권장하거나 진행할 때 정의


9

스크립트에서 bash 변수의 값을 메인 코드 이전에, 또는 실제 값을 할당하기 전에 함수의 로컬 변수를 초기화하는 이점 / 불이익이 있습니까?

나는 이런 식으로해야합니까?

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

init "Mark"

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


2
이 아이디어를 어디서 얻었습니까?

6
@DoritoStyle 글쎄, C와 같은 저수준 언어에 사용된다면, 이것은 완벽하게 유효한 것입니다.
Kusalananda

@Kusalananda C가 해당 코드와 동일하지 name = ""; name = argv[1];않습니까? 그리고 그것은 무의미하지 않습니까?
Joseph Sible-Reinstate Monica

1
@ JosephSible-ReinstateMonica 예. 게시 한 C 코드는 의미가 없습니다. 그러나 C에서는 셸과 달리 초기화되지 않은 변수에는 잘 정의 된 특정 값이 없습니다. 이것은 C와 같은 언어로 변수를 초기화하는 것이 많은 상황에서 의미가 있음을 의미합니다. 쉘에서 그렇게 할 필요는 없습니다. 다른 값으로 즉시 설정하기 위해 C에서 변수를 초기화하는 것은 의미가 없습니다.
Kusalananda

답변:


22

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

내 지식에는 변수를 빈 문자열로 명시 적으로 초기화해야한다는 권장 사항이 없습니다. 실제로 그렇게하면 일부 상황에서 오류가 가려 질 수 있습니다 (에서 실행되는 경우 명백한 오류는 set -u아래 참조).

스크립트 시작 이후 사용되지 않거나 unset명령을 실행하여 명시 적으로 설정 해제 된 설정 해제 변수 는 값이 없습니다. 그러한 변수의 가치는 아무것도 아닙니다. 로 사용 "$myvariable"하면에 해당하는 값을 얻게되며 """쓰레기 데이터"를 얻지 못할 것입니다.

쉘 옵션 nounsetset -o nounset또는 로 설정되어 set -u있으면 설정되지 않은 변수를 참조하면 쉘에서 오류가 발생하고 대화식이 아닌 쉘이 종료됩니다.

$ set -u
$ echo "$myvariable"
/bin/sh: myvariable: parameter not set

또는 bash:

$ set -u
$ echo "$myvariable"
bash: myvariable: unbound variable

변수 이름이 기존 환경 변수에 해당하는 경우 환경에서 셸 변수가 초기화됩니다.

이런 식으로 환경에 의해 초기화 될 수있는 변수를 사용하고 (원치 않는 경우) 스크립트의 주요 부분 전에 명시 적으로 설정 해제 할 수 있습니다.

unset myvariable    # unset so that it doesn't inherit a value from the environment

환경 변수로 제거하거나 초기 값을 무시하고 할당으로 덮어 씁니다 (환경 변수도 값을 변경하게 함).

셸 변수에서 초기화되지 않은 가비지가 발생하지 않습니다 (설명한 바와 같이 가비지가 동일한 이름으로 환경 변수에 이미 존재하지 않는 한).


3
변수를 빈 값으로 설정 한 다음 문자 그대로 OP와 같이 즉시 설정하는 값은 없지만 unset어떤 종류의 루프를 실행하기 전에 빈 값 을 설정 for하거나 while계산하여 값을 계산하는 값이 있습니다 조건이 충족되지 않아서 루프가 실제로 실행되지 않을 가능성이있는 경우 값; 스크립트가 상속 한 환경에서 변수가 다른 값으로 설정되었을 수 있습니다. 그러나 모든 것을 a에 넣고 main()변수를로 정의하는 것이 더 좋습니다 local.
Monty Harder

:예를 들어${myvariable-defaultvalue}
Barmar

3

편집 : 죄송합니다 . 명백하게 선언은 초기화와 다릅니다. 어쨌든 저와 같은 초보 코더가 내 실수에서 배울 수 있도록 이것을 남겨 둘 것입니다.


함수에서 지역 변수를 선언하면 코드를 쉽게 복사 할 수 있다는 장점이 있습니다.

예를 들어 함수가 있다고 가정 해보십시오.

foo(){
    local name
    name="$1"
    echo "$name"
}

스크립트로 작성하려면 local문장을 무시하고 다른 모든 것을 복사하십시오.

#!/bin/bash
name="$1"
echo "$name"

선언과 할당이 같은 줄에 있다면 local파트를 스크립트로 바꾸기 전에 파트 를 수동으로 편집해야합니다 .

foo(){
    local name="$1"
    echo "$name"
}

이 예제에서는 큰 문제가 아니지만 더 크고 복잡한 기능을 다루는 경우 더 고통 스러울 수 있습니다.


1
문제는 선언과 초기화를 결합하는 것이 아닙니다. 실제 값을 할당하기 전에 빈 값으로 초기화할지 여부입니다.
Barmar

@Barmar 아, 방금 "초기화"를 찾았습니다. 나는 그것이 "선언"과 동의어라고 생각했다.
wjandrea
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.