bash 스크립팅에서 선언과 일반 변수의 차이점은 무엇입니까?


43

bash 스크립팅에서 :

이름을 지정하여 변수를 만듭니다.

abc=ok

또는 우리는 사용할 수 있습니다 declare

declare abc=ok

차이점이 뭐야?

bash는 왜 변수를 만드는 많은 방법을 사용합니까?


6
함수에서 사용될 때 명령 declare과 같이 NAME을 로컬로 만듭니다 local. 이 -g옵션은이 동작을 억제합니다. 참조하십시오 help declare.
사이러스

2
declare연관 배열, 정수 및 읽기 전용 변수를 작성할 수 있습니다. 또한 논증을 넓히므로 이와 같은 declare $name=1것들이 가능합니다.
choroba

답변:


34

보낸 사람 help -m declare:

이름

    declare -변수 값과 속성을 설정하십시오.

개요

    declare[ -aAfFgilnrtux] [ -p] [ name[ ] ...]=value

기술

    변수 값과 속성을 설정하십시오.

    변수를 선언하고 속성을 제공하십시오. 이름을 지정하지 않으면 모든 변수의 속성과 값을 표시하십시오.

    옵션 :

      -f
        기능 이름 및 정의로 조치 또는 표시 제한
      -F
        함수 이름으로 만 표시 제한 (디버깅시 라인 번호 및 소스 파일 포함)
      -g
        쉘 함수에서 사용될 때 전역 변수를 작성하십시오. 그렇지 않으면 무시
      -p
        각 NAME의 속성과 값을 표시

    속성을 설정하는 옵션 :

      -a
        NAME을 색인 배열로 만들려면 (지원되는 경우)
      -A
        NAME을 연관 배열로 만들기 (지원되는 경우)
      -i
        NAME에게 '정수'속성을 갖도록
      -l
        할당시 NAME을 소문자로 변환
      -n
        NAME을 값으로 명명 된 변수에 대한 참조로 설정
      -r
        NAME을 읽기 전용으로 설정
      -t
        NAME에게 'trace'속성을 갖도록
      -u
        할당시 NAME을 대문자로 변환
      -x
        NAMEs 내보내기

    ' +'대신 ' '를 사용 -하면 지정된 속성이 꺼집니다.

    정수 속성을 가진 let변수는 변수에 값이 지정 될 때 수행되는 산술 평가 ( 명령 참조 )를 갖습니다.

    함수에서 사용될 때 명령 declare과 같이 NAME을 로컬로 만듭니다 local. ' -g'옵션은이 동작을 억제합니다.

    종료 상태 :
    유효하지 않은 옵션이 제공되거나 변수 할당 오류가 발생하지 않으면 성공을 반환합니다.

또한보십시오

    배쉬 (1)

이행

    GNU bash, 버전 4.3.11 (1)-릴리즈 (i686-pc-linux-gnu)
    Copyright (C) 2013 Free Software Foundation, Inc.
    라이센스 GPLv3 + : GNU GPL 버전 3 이상 <http://gnu.org/ licenses / gpl.html>


따라서 declare변수 값 과 속성 을 설정하는 데 사용됩니다 .

간단한 예를 통해 두 가지 속성을 사용하는 방법을 보여 드리겠습니다.

$ # First Example:
$ declare -r abc=ok
$ echo $abc
ok
$ abc=not-ok
bash: abc: readonly variable


$ # Second Example:
$ declare -i x=10
$ echo $x
10
$ x=ok
$ echo $x
0
$ x=15
$ echo $x
15
$ x=15+5
$ echo $x
20

위의 예에서 declare일반 변수보다 변수 사용법을 이해해야한다고 생각합니다 ! 이 유형의 declareation은 함수, 스크립팅 루프에서 유용합니다.

또한 입력 변수 방문 : 선언 또는 조판


예, "및 속성"이 핵심입니다! 이것이 차이점입니다.
lovespring

큰! 나는 가르치고 배우는 가장 좋은 방법 인 모범을 좋아합니다. 감사!
turkenh

1
이 답변을 이해하려면 "속성"이 무엇인지 알아야합니다. '정수', '배열'또는 '읽기 전용'과 같은 변수의 속성입니다.
Noumenon

11

abc=ok변수에 값을 할당합니다 abc. declare abc라는 변수를 선언합니다 abc. 둘은로 결합 될 수 있습니다 declare abc=ok.

bash에서는 다른 쉘과 마찬가지로 문자열 및 배열 변수를 선언 할 필요 declare가 없으므로 연관 배열 을 만들거나 변수를 읽기 전용 declare -A abc으로 만드는 등 abc의 옵션을 전달하지 않는 한 필요하지 않습니다 declare -r. 그러나 함수 내에서 declare차이를 만듭니다. 변수가 함수의 로컬 변수가되므로 함수 외부의 변수 값 (있는 경우)이 유지됩니다. (을 사용하지 않으면 declare -g변수가 로컬이 아닌 변수가됩니다. 예 declare -gA를 들어 함수에 전역 연관 배열을 만드는 등의 다른 옵션과 결합 할 때 유용 합니다.) 예 :

f () {
  declare a
  a='a in f'
  b='b in f'
  echo "From f: a is $a"
  echo "From f: b is $b"
}
a='Initial a'
b='Initial b'
f
echo "After f: a is $a"
echo "After f: b is $b"

산출:

From f: a is a in f
From f: b is b in f
After f: a is Initial a
After f: b is b in f

declare내장으로 할 수있는 또 다른 일은

declare내장 bash는 고유합니다. 그것은 ksh의 typeset내장 과 매우 흡사하고 강렬 하며 bash는 호환성 typeset의 동의어로 declare제공됩니다. (Bash가 왜 그렇게 부르지 않았는지 모르겠다 typeset). 세 번째 동의어가 local있습니다. 도 있습니다 export와 같은 인 declare -x(모든 Bourne의 스타일 쉘)의 호환성을 위해 다시.


예! '및 옵션'이 포인트입니다. 추신 내가 bash를 디자인하면 "선언"의 행동이 다른 조건에서 어떤 일을하게 할 것입니다. 이것은 일을 간단하게 만듭니다.
lovespring

좋은 대답입니다. 또 다른 질문, 사이에 하나 export, local그리고 declare다른 조개와 가장 호환?
0xc0de

1
@ 0xc0de export는의 모든 변종에 존재합니다 sh. localbash와 zsh에만 존재하며 bash에만 존재합니다 declare. typesetksh, bash 및 zsh에 존재합니다.
Gilles 'SO- 악마 중지'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.