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

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

Bash 스크립트에서:

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

abc=ok

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

declare abc=ok

차이점은 무엇입니까?

Bash에는 왜 변수를 생성하는 방법이 그렇게 많습니까?

답변1

에서 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
        이름 내보내기

    사용'+' 바꾸다'-' 주어진 속성을 끕니다.

    정수 속성이 있는 변수는 let변수에 값을 할당할 때 산술 평가를 수행합니다(명령 참조).

    함수 내에서 사용될 때 명령을 declare사용하는 것과 마찬가지로 NAME을 로컬 이름으로 만듭니다 . local이것'-g' 옵션은 이 동작을 억제합니다.

    종료 상태:
    잘못된 옵션이 제공되거나 변수 할당 오류가 발생하지 않는 한 성공을 반환합니다.

당신은 또한 볼 수 있습니다

    큰 타격(1)

구현하다

    GNU bash, 버전 4.3.11(1)-릴리스(i686-pc-linux-gnu)
    저작권 (C) 2013 Free Software Foundation, Inc.
    라이센스 GPLv3+: GNU GPL 버전 3 이상 <http:// gnu.org/ 라이센스/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변수는 평범한 변수를 뛰어넘는다! 이러한 유형의 declare작업은 함수 및 스크립트 루프에 유용합니다.

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

답변2

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

Bash에서는 다른 쉘과 마찬가지로 문자열 및 배열 변수를 선언할 필요가 없으므로 declare연관 배열 생성 또는 변수를 읽기 전용으로 만드는 등의 옵션을 전달하려는 경우가 아니면 필요하지 않습니다. 그러나 함수 내부에서는 차이가 있습니다. 즉, 변수를 함수에 대해 로컬로 만듭니다. 즉, 함수 외부의 변수 값(있는 경우)이 보존된다는 의미입니다. (이것은 사용자가 사용하지 않는 한 변수를 로컬이 아닌 것으로 만듭니다. 이는 함수에서 전역 연관 배열 생성과 같은 다른 옵션과 결합할 때 유용합니다.) 예:declare -A abcabcdeclare -rdeclaredeclare -gdeclare -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에 고유합니다. 이는 호환성의 동의어 typeset로 제공되는 ksh 및 bash의 내장 기능 에서 크게 영감을 받았으며 이에 매우 가깝습니다 . (bash가 왜 직접 호출하지 않는지 모르겠습니다 ). 세 번째 유사한 것이 있는데, 그 외에는 동일하지만 기능 내에서만 작동합니다. 그리고 다시 한 번 호환성을 위해 (모든 Bourne 스타일 쉘과의).typesetdeclaretypesetlocalexportdeclare -x

관련 정보