Bash에서 “ declare ”는 무엇인가요?

이 질문 에 대한 ilkkachu의 답변을 읽은 후 저는 declare (인수 -n) 셸이 내장되어 있습니다.

help declare 가져 오기 :

변수 값 및 속성을 설정합니다.

변수를 선언하고 속성을 제공합니다. 이름이 제공되지 않으면 모든 변수의 속성 및 값.

-n … NAME을 해당 값으로 명명 된 변수에 대한 참조로 만듭니다.

I man를 이해하지 못하기 때문에 declare에 대한 예와 함께 일반적인 설명을 요청하세요. 변수가 무엇인지 알고 확장하지만 여전히 declare (변수 속성?)의 man가 누락되었습니다.

아마도 답변에있는 일 카츄의 코드를 기반으로 설명하고 싶을 것입니다.

#!/bin/bash function read_and_verify { read -p "Please enter value for "$1": " tmp1 read -p "Please repeat the value to verify: " tmp2 if [ "$tmp1" != "$tmp2" ]; then echo "Values unmatched. Please try again."; return 2 else declare -n ref="$1" ref=$tmp1 fi } 

댓글

답변

대부분의 경우 bash

asdf="some text" 

하지만 때로는 변수의 값이 정수만되기를 원합니다 (따라서 나중에 자동으로 변경 될 경우에도 다음으로 만 변경 될 수 있습니다. 정수, 경우에 따라 기본값은 0)이며 다음을 사용할 수 있습니다.

declare -i num 

또는

declare -i num=15 

때로는 배열을 원하고 declare

declare -a asdf # indexed type 

또는

검색 문자열”bash array tutorial “(따옴표 제외)로 인터넷을 검색하면 bash에서 배열에 대한 좋은 자습서를 찾을 수 있습니다. 예

linuxconfig.org/how-to-use-arrays-in-bash-script


변수를 선언 할 때 가장 일반적인 경우라고 생각합니다.


또한 함수에서

  • declare 변수를 로컬로 만듭니다 (함수에서)
  • 이름없이 모든 변수를 나열합니다 (활성 셸에 있음).

    declare 

마지막으로 iv id = “에서 쉘 내장 명령 declare의 기능에 대한 간략한 요약을 볼 수 있습니다. c97b0c7f5a “>

명령 사용

help declare 

댓글

  • OP에서 안녕하세요! 나는 당신의 대답이 훌륭하다고 생각하고 그것을 찬성했으며 내 의견으로는 매우 교훈적인 대답에 감사드립니다. 저는 저의 겸손한 의견으로는 초보자가 더 쉽게 읽을 수 있도록 약간의 편집을 제안했습니다. 제안 사항을 검토해 보시기 바랍니다.
  • user:muru이 (가) 편집 거부에 투표 한 것을 확인했습니다. 저와 muru가이 웹 사이트의 여러 섹션에서 여러 번 ” 충돌 “을했으며 그의 거부가

    목표가 아니며 여기에있는 수정 제안 페이지에 표시된 직접 변경 사항과 달리 실제로 유해합니다. unix.stackexchange.com/review/suggested -edits / 325749

  • @JohnDoea, 다른 사용자도 귀하의 편집을 거부 한 것을 확인했습니다. 나는 당신의 편집 중 일부는 훌륭하다고 생각하지만 일부는 내가 의도 한 메시지를 변경하므로 마음에 들지 않습니다. 좋은 수정이라고 생각되는 내용을 포함하도록 답변을 수정할 수 있습니다.
  • 감사합니다. 아시다시피, SE에서는 편집을 거부하는 것이 (부분적으로도) 수락하는 것보다 훨씬 더 일반적입니다. 다른 사용자가 수정을 거부했음을 알리고 (정직하게 ‘ 전에는 보지 못함) 답변에 내 수정 사항 중 일부를 삽입 할 것을 고려해 주셔서 감사합니다. 정말 존경합니다.

답변

help declare 꽤 간결합니다. 보다 명확한 설명은 man bash 또는 info bash에서 찾을 수 있습니다. 후자는 다음 내용의 소스입니다.

첫째, 몇 가지 정의입니다. 변수 및 속성 정보 :

매개 변수 는 값을 저장하는 엔티티. … 변수 name로 표시되는 매개 변수입니다. 변수에는 과 0 개 이상의 속성 이 있습니다. 속성은 declare 내장 명령을 사용하여 할당됩니다.

declare 내장 :

declare

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

변수를 선언하고 속성을 제공합니다. 이름이 지정되지 않은 경우 대신 변수 값을 표시합니다.

-n
name nameref 속성으로, 다른 변수에 대한 이름 참조가됩니다. 다른 변수는 name 의 값으로 정의됩니다. 이름 에 대한 모든 참조, 할당 및 속성 수정은 -n 속성 자체를 사용하거나 변경하는 경우를 제외하고 에서 참조하는 변수에서 수행됩니다. 이름 의 가치. …

이름 참조 변수는 Bash 4.3 이상에서만 사용할 수 있습니다. 1 .

또한 declare 및 Bash의 변수 속성에 대한 유용한 소개를 위해 이 “에 대한 답변 declare namedeclare -g는 무엇을합니까? ” (주로 변수 범위에 중점을 둡니다).


기본적으로 2 , declare name=[value]는 익숙한 name=[value] 할당과 동일합니다. 두 경우 모두 name에 null이 할당됩니다. value가 누락 된 경우 값입니다.

약간 다른 declare name가 대신 설정되지 않습니다. 변수 name 3 :

 $ declare name ## With the -p option, declare is used to display ## attributes and values of variables $ declare -p name declare -- name ## "name" exists ## Parameter expansion can be used to reveal if a variable is set: ## "isunset" is substituted to "name" only if unset $ echo "${name-isunset}" isunset  

따라서 name 변수는 다음과 같을 수 있습니다.

  • 선언 unset , declare name;
  • 선언 설정 후 null , name= 또는 declare name= 뒤;
  • 선언 됨 , set name=value 또는 iv id = “6810b6add 뒤에 null이 아닌 값 포함 9 “>

.

보다 일반적으로 declare [options] name=value

  1. 변수 name — 이름이있는 매개 변수이며, 이는 정보를 저장하는 데 사용할 수있는 메모리의 일부일뿐입니다 4 ;
  2. 할당 값 value;
  3. 선택적으로 값의 종류를 정의하는 name “의 속성을 설정합니다. (엄격히 말하면 Bash의 언어가 입력되지 않았기 때문에 유형 이 아니라) 조작 할 수있는 방법을 저장할 수 있습니다.

속성은 다음과 같습니다. 예를 들어 설명하기 쉬울 것입니다. declare -i name를 사용하면 ” 정수 ” 속성이 설정됩니다. name 중 정수로 처리되도록합니다. 수동 인용, ” 변수에 값이 할당되면 산술 평가가 수행됩니다 ” :

 ## Let"s compare an ordinary variable with an integer $ declare var $ declare -i int $ var="1+1" $ int="1+1" $ echo "$var" 1+1 ## The literal "1+1" $ echo "$int" 2 ## The result of the evaluation of 1+1  

위와 같이 ilkkachu의 코드에서 일어나는 일은 다음과 같습니다.

  1. ref라는 변수가 ” nameref ” 속성 집합 및 $1 (첫 번째 위치 인수)의 내용이 할당됩니다. it :

     declare -n ref="$1"  

    는 일반적으로 미리 알려지지 않은 다른 변수의 이름을 보유하는 것입니다. 이는 아마도 동적으로 정의되기를 원하기 때문입니다 (예 : 코드 조각을 재사용하고 여러 변수에 적용됨) 및 참조 (및 조작)하는 편리한 방법을 제공합니다. (유일한 것은 아니지만 간접적 방법은 대안입니다. 셸 매개 변수 확장 참조).

  2. 시기 변수 tmp1의 값은 ref에 할당됩니다.

     ref=$tmp1  

    이름이 ref 값인 추가 변수가 암시 적으로 선언됩니다. tmp1의 값은 ref에 대한이 명시 적 할당을 통해 암시 적으로 선언 된 변수에 간접적으로 할당됩니다. .

연결된 질문 의 맥락에서 read_and_verify as

 read_and_verify domain "Prompt text here..."  

는 에 tmp1 값 (예 : 사용자 입력)을 할당합니다. 사용자와 상호 작용하는 코드를 재사용하고 nameref 변수를 활용하도록 정확히 설계되었습니다. domain 및 몇 가지 다른 변수를 선언합니다.

암시 적 부분을 자세히 살펴보기 위해 프로세스를 단계별로 재현 할 수 있습니다.

 ## Assign a value to the first positional argument $ set -- "domain" ## Declare the same "tmp1" variable as in your code $ tmp1="value for domain" ## Declare a "ref" variable with the nameref attribute set and ## assign the value "domain" to it $ declare -n ref="$1" ## Note that there is no "domain" variable yet $ declare -p domain bash: declare: domain: not found ## Assign a value to "ref" and, indirectly, to the "domain" variable ## that is implicitly declared $ ref=$tmp1 ## Verify that a variable named "domain" now exists, and that ## its value is that of "tmp1" $ declare -p domain declare -- domain="value for domain" ## Verify that "ref" is actually a reference to "domain" $ domain="new value" $ echo "$domain" new value $ declare -p ref declare -n ref="domain" $ echo "$ref" new value  

1 참조 : 변경 사항 파일, 섹션 ” 3. Bash의 새로운 기능 “, 포인트 ” w “.
관련 될 수 있습니다. 예를 들어 CentOS Linux 7.6 (현재 최신 버전) Bash 4.2 와 함께 제공됩니다.

2 평소와 같이 쉘 내장, 철저한 간결한 설명은 다양하고 이질적인 작업을 수행하기 때문에 이해하기 어렵습니다. 속성 선언, 할당 및 설정에만 초점을 맞추고이 답변의 범위를 벗어나는 속성을 나열, 범위 지정 및 제거하는 것을 고려할 것입니다.

3 declare -p의이 동작은 Bash 4.4에서 도입되었습니다. 참조 : 변경 사항 파일, 섹션 ” 3. Bash의 새로운 기능 “, 포인트 ” f “.
As G-Man 은 Bash 4.3에서 declare name; declare -p name 오류를 생성합니다. 하지만 declare -p | grep "declare -- name"name가 존재하는지 확인할 수 있습니다.

4 FullBashGuide, 매개 변수 (mywiki.wooledge.org)

댓글

  • (1) 첫 번째 코드 블록에 표시 한 결과를 재현 할 수 없습니다. declare name 다음에 declare -p name는 “bash : declare : name : not found”를 생성합니다. (declare -p | grep nadeclare -- name를 산출하지만) (2) echo "${name-isunset}" declare name 컨텍스트에서 선언되지 않은 (즉, 정의되지 않은) 변수를 선언 된 변수와 동일하게 처리하기 때문입니다. i>하지만 설정되지 않은 변수. (3) nameref는 bash 버전 4.3 이상에서만 사용할 수 있다고 언급 할 수 있습니다.
  • @ G-Man 의견을 보내 주셔서 감사합니다! ‘ 가능한 한 빨리 문제를 해결하고 ‘ 적절한 경우 답변을 업데이트하겠습니다. (1)의 경우 Arch Linux의 GNU bash, version 5.0.7(1)-release (x86_64-pc-linux-gnu)는 여전히 내가 보여준 결과를 산출합니다. 그 행동은 최근에야 도입되었을 수 있습니다. ‘ 조사하겠습니다.
  • 예; 저는 ‘ 버전 4.3 만 사용하고 있습니다.
  • @ G-Man 답변이 (1) 및 (3)에 대한 메모로 업데이트되었습니다. (2) 정보 : declare x가 ‘ x를 설정하지 않는다는 것을 설명하고자했습니다. declare x=는 그렇습니다. ‘ declare -- x (declare -p x)는 ” 설정되지 않음 “을 의미하고 declare -- x=""는 설정 “; 그래서 ” unset “를 구별 할 수 없더라도 ${parameter-word} 확장을 가져 왔습니다. 지적했듯이 ” 존재하지 않음 ‘ “. 그래도 ‘ 내 답변에서이를 명확히 할 수 있을지 모르겠습니다 (독자의주의를 분산시키지 않고).

답변

나는 이것을 시도하고 설명 할 것이지만, 당신이 제공 한 예를 따르지 않는다면 용서해주세요. 차라리 내 자신의 다른 접근 방식에 따라 안내하려고 노력할 것입니다.

변수및 확장등과 같은 개념을 이미 이해하고 있다고 말씀 하셨으므로 몇 가지를 훑어 보겠습니다. 그렇지 않으면 더 깊은 초점을 필요로하는 배경 지식입니다.

그러니 기껏해야 기본 수준에서 declare 명령은 Bash에게 변수 값 (즉, 스크립트 실행 중에 변경 될 수있는 값)이 필요하다는 것을 알리는 방법 일뿐입니다. 특정 이름, 정확하게 declare 명령 자체 옆에 표시 한 이름을 사용하여 해당 값을 참조하십시오.

즉 :

 declare foo="bar"  

는 Bash에게 foo라는 변수가 bar 값을 갖기를 원합니다.

하지만 .. 잠시만 기다려주세요. declare를 전혀 사용하지 않고 그렇게 할 수는 없습니다. 예 :

 foo="bar"  

매우 맞습니다.

좋습니다. , 위의 간단한 할당이 실제로는 암시 적 방식으로 .. 실제로 .. 변수를 선언하는 것입니다.

( 위가 하나 이름이 foo 인 변수의 값을 변경합니다. 실제로 가장 직접적입니다. 간결하고, 분명하고, 직관적 인 방법 ..하지만 그게 유일한 방법은 아닙니다 .. .. 나중에 다시 설명하겠습니다 .. ).

하지만 그렇다면 declare를 전혀 사용하지 않고 “변수 값에 태그를 지정할 이름”(이후부터는 간단히 “변수”)을 선언 할 수 있습니다. 이 화려한 “선언”명령을 사용 하시겠습니까?

답은 위의 implici 변수를 선언하는 방법 (foo="bar"), 암시 적으로 .. Bash는 해당 변수를 셸의 일반적인 사용 시나리오에서 가장 일반적으로 사용되는 유형으로 간주합니다. .

이러한 유형은 문자열 유형, 즉 특별한 의미가없는 일련의 문자입니다. 따라서 문자열은 암시 적 선언을 사용할 때 얻는 것입니다.

하지만 프로그래머는 때때로 변수를 산술을 수행해야하는 숫자로 간주해야합니다. operations .. 및 foo=5+6와 같은 암시 적 선언을 사용하면 Bash가 다음과 같이 값 11을 foo에 할당하지 않습니다 . 당신은 기대할 수 있습니다. 오히려 foo 세 문자의 시퀀스 5 + 6.

그래서 .. foo가 숫자가 아닌 숫자로 간주되기를 원한다고 Bash에게 알려주는 방법이 필요합니다. string .. 이것이 바로 명시 적 declare가 유용하게 사용되는 이유입니다.

그냥 말하세요 :

 declare -i foo=5+6 # <<- note the "-i" option: it means "integer"  

그리고 Bash는 기꺼이 계산을 수행하고 숫자 값 11을 변수 .

즉, declare -i foo라고 말하면 foo 변수에 속성 은 정수입니다.

숫자 선언 (정확히 정수, Bash는 여전히 소수, 부동 소수점 등을 이해하지 못하기 때문에)가

그러나 이것이 유일한 이유는 아닙니다. 이미 이해했듯이 변수에 부여 할 수있는 몇 가지 다른 속성이 있습니다. 예를 들어 Bash를 사용하여 어떤 경우에도 항상 변수 값을 대문자로 만들 수 있습니다. declare -u foo라고 말하면 그때부터 foo=bar Bash는 실제로 BAR 문자열을 foo 변수에 할당합니다.

이러한 속성을 제공하기 위해 변수에 반드시 declare 명령을 사용해야합니다. 다른 선택은 없습니다.


이제 declare를 통해 제공 할 수있는 속성은 악명 높은 “name-ref”속성 인 -n 속성입니다. ( 이제 이전에 보류했던 개념을 다시 시작하겠습니다 ).

기본적으로 name-ref 속성은 Bash 프로그래머가 다른 방법으로 값을 변경할 수 있도록합니다. 더 정확하게는 간접 방법을 제공합니다.

방법 작동합니다.

declare -n 속성을 가진 변수이며 매우 권장 (엄격하게 요구되지는 않지만 작업이 더 간단 해짐) 같은 declare의 매우 변수 인 this 에 값을 제공하는 것도 좋습니다. div> 명령입니다. 다음과 같습니다.

 declare -n baz="foo"  

이것은 Bash에게 그때부터 on, baz라는 변수의 값을 사용하거나 변경할 때마다 .

그때부터는 baz=10+3와 같이 말하면 foo가 13의 값을 얻습니다.물론 foo가 1 분 전에했던 것처럼 정수 (declare -i)로 이전에 선언되었다고 가정하면, 그렇지 않으면 시퀀스를 얻습니다. 네 문자 중 1 0 + 3.

또한 : foo=15에서와 같이 foo의 값을 직접 변경하면 15 또한 echo “${baz}”라고 말하면됩니다. 이는 foo의 name-ref로 선언 된 변수 baz가 항상 foo의 값입니다.

위의 declare -n 명령은 변수 baz 다른 변수의 이름 을 참조하십시오. 실제로 우리는 baz에 “foo”값이 있다고 선언했습니다.이 값은 -n 옵션으로 인해 Bash에서 다음의 이름으로 처리됩니다. 또 다른 변수입니다.

이제 지구에서 그렇게하고 싶습니까?

음 ..이 기능은 상당히 고급 요구 사항을위한 기능이라고 말할 가치가 있습니다.

사실 너무 발전하여 프로그래머가 실제로 이름 참조가 필요한 문제에 직면했을 때도 이러한 문제는 Bash 대신 적절한 프로그래밍 언어를 사용하여 해결해야 할 가능성이 높습니다.

이러한 고급 요구 사항 중 하나는 예를 들어 프로그래머로서 개발 중에 알 수없는 경우입니다. 스크립트의 특정 지점에서 사용해야하는 변수이지만 런타임에 동적으로 완전히 알려질 것입니다 . 프로그래머가 런타임에 개입 할 수있는 방법이 없다는 점을 고려할 때 유일한 옵션은 스크립트에서 이러한 상황에 대해 사전에 프로비저닝하는 것이며 “name-ref”가 유일하게 실행 가능할 수 있습니다. 방법. 이러한 고급 요구에 대한 널리 알려진 사용 사례로, 예를 들어 플러그인을 생각해보십시오. “플러그인 가능”프로그램의 프로그래머는 사전에 향후 (및 가능하면 타사) 플러그인에 대한 일반적인 프로비저닝을 만들어야합니다. 따라서 프로그래머는 Bash에서 이름 참조와 같은 기능을 사용해야합니다.

다른 한 가지 고급 요구 사항은 RAM에서 엄청난 양의 데이터를 처리해야하는 경우입니다. 스크립트의 함수 주변에 데이터를 전달해야하며 또한 해당 데이터를 수정해야합니다. 이러한 경우에는 분명히 데이터를 한 함수에서 다른 함수로 복사 할 수 있습니다 (예 : dest_var="${src_var}"를 수행 할 때 또는

),하지만 엄청난 양의 데이터이므로 RAM을 크게 낭비하고 매우 비효율적 인 작업을 수행합니다. 따라서 이러한 상황이 발생하는 경우 해결책은 데이터 사본이 아니라 해당 데이터에 대한 참조 를 사용하는 것입니다. Bash에서 이름 참조. 이 사용 사례는 실제로 모든 최신 프로그래밍 언어에서 표준이지만 Bash에 관해서는 매우 예외적입니다. Bash는 대부분 파일과 외부 명령을 주로 처리하는 간단한 간단한 스크립트 용으로 설계 되었기 때문에 Bash 스크립트는 거의 전달하지 않아도됩니다. 함수 간의 데이터 양. 그리고 스크립트의 함수가 일부 데이터를 공유해야하는 경우 (액세스 및 수정) 일반적으로 전역 변수를 사용하여 수행됩니다. 이는 Bash 스크립트에서 매우 일반적인 것입니다. 적절한 프로그래밍 언어에서 더 이상 사용되지 않습니다.

그런 다음 Bash에서 이름 참조에 대한 주목할만한 사용 사례가있을 수 있으며 (아이러니하게도) 다른 유형의 변수를 사용할 때 관련됩니다.

  1. 인덱싱 된 배열로 선언 된 변수 (declare -a)
  2. 연관 배열로 선언 된 변수 (declare -A).

함수를 따라 더 쉽게 (더 효율적으로) 전달할 수있는 변수 유형입니다. 엄청난 양의 데이터를 가지고 있지 않더라도 일반적인 복사 대신 이름 참조를 사용합니다.

이 모든 예가 이상하게 들리지만 여전히 이해할 수 없다면 이름 참조가 실제로 고급 주제 및 B의 일반적인 사용 시나리오에 대한 드문 필요 애쉬.

제가 Bash에서 이름 참조로 사용 된 경우에 대해 말씀 드릴 수 있지만 지금까지는 대부분이 “비교적”이고 복잡한 요구 사항에 사용되었습니다. 내가 그것들을 설명한다면, 당신의 배움의이 시점에서 나는 당신을 위해 일을 복잡하게 만들 것입니다. 가장 복잡하지 않은 (그리고 난해하지 않을 수도 있음) : 함수에서 값을 반환합니다. Bash는이 기능을 실제로 지원하지 않으므로 name-refs를 사용하여 동일한 기능을 얻었습니다. 우연히 이것은 여러분의 예제 코드가하는 일입니다.


이 외에도 작은 개인적인 조언이 있습니다. 실제로 주석에 더 적합 할 수 있지만 충분히 요약 할 수는 없습니다. StackExchange의 코멘트 제한에 맞도록

현재 가장 해야 할 일은 내가 보여준 간단한 예제를 사용하여 이름 참조를 실험하는 것입니다. 지금은 “지상에서 왜”부분이고 “작동 방식”부분에만 초점을 맞추고 있습니다. 약간의 실험을 통해 “어떻게”부분이 당신의 마음 속에 더 잘 스며들 수 있습니다. 그래서 “왜”부분은 당신이 이름과 같은 실제적인 문제가있을 때 (또는 만약) 때가되면 당신에게 분명해질 것입니다. ref가 정말 유용 할 것입니다.

댓글

  • LL3 귀하의 답변이 매우 마음에 들었고 엄지 손가락을 치켜 드렸습니다. 드디어 선언이 무엇을하는지 이해합니다. -변수를 선언하지 않고 속성을 선언합니다. 그러나 슬프게도 이름 참조가 무엇인지 설명하기 시작했을 때 나는 길을 잃었습니다. 나는 그것이 무엇을하는지, 왜 그것을 사용해야하는지 전혀 몰랐습니다.
  • 그것이-이 속성을 부여하는 이유입니다.
  • @JohnDoea 알겠습니다. 잠시이 주제를 떠날 수도 있습니다. 학습의 현재 시점에서이 개념을 이해하기에는 너무 이릅니다. 어쨌든 저는 더 많은 예제와 어떻게 진행해야한다고 생각하는지에 대한 개인적인 부록으로 제 답변을 확장했습니다. 또한 개인 부록에있는 -n의 특정 설명에서 declare에 대한 일반적인 설명을 구분하기 위해 수평선을 넣었습니다. 또한 여기저기서 약간의 단어를 변경했지만 실질적인 내용은 없었으므로 -n 부분과 작은 부록을 다시 읽어 보시기 바랍니다.
  • 감사합니다. ‘ 지금이 문제에 대해 배우는 것이 괜찮다고 생각합니다. 이해할 수있는 설명이 필요하며 오늘 전체 답변을 다시 읽어야합니다. ‘ 여기 있습니다.
  • foo="bar"declare foo="bar"를 언급하셨습니다. . 셸 함수에서 declare foo="bar"는 지역 변수를 만들고 foo="bar"는 다음을 생성한다는 것을 언급 할 수 있습니다 (각주에만있는 경우). 전역 변수입니다.

답변

일반적으로 declare in bash 셸은 변수에 대한 속성 을 설정 (또는 제거 또는 표시)합니다. 속성은 “이것은 이름 참조입니다”, “이는 연관 배열입니다”, “이 변수는 항상 정수로 평가되어야합니다”또는 “이 변수는 읽기 전용이므로 사용할 수 없습니다”라는 주석의 일종입니다. 다시 설정 “또는”이 변수를 내 보냅니다 (환경 변수) “등.

typeset 기본 제공은 iv id의 동의어입니다. typeset는 다른 셸에서 사용되므로 bash의 = “0dc7e3df43”>

(ksh, 예를 들어zsh) 변수 속성 설정을위한 것입니다.


이름 참조 예제를 더 자세히 살펴 보겠습니다. 질문 :

표시하는 쉘 함수와이를 사용하는 추가 코드 :

#!/bin/bash function read_and_verify { read -p "Please enter value for "$1": " tmp1 read -p "Please repeat the value to verify: " tmp2 if [ "$tmp1" != "$tmp2" ]; then echo "Values unmatched. Please try again."; return 2 else declare -n ref="$1" ref=$tmp1 fi } read_and_verify foo printf "The variable "foo" has the value "%s"\n" "$foo" 

실행 :

 $ bash script.sh Please enter value for "foo": hello Please repeat the value to verify: hello? Values unmatched. Please try again. The variable "foo" has the value "" 

사용자가 두 개의 다른 값을 입력 할 때 foo 변수가 아무것도 설정되지 않음을 보여줍니다. 문자열.

즉, 변수 foo가 사용자가 동일한 문자열을 두 번 입력했을 때 입력 한 문자열로 설정됨을 보여줍니다. .

스크립트의 주요 부분에서 $foohello 값을 가져 오는 방법은 다음 줄을 따릅니다. 쉘 함수 :

declare -n ref="$1" ref=$tmp1 

여기서 $tmp1는 문자열 hello는 사용자가 입력하고 $1는 주요 부분에서 함수의 명령 줄에 전달 된 문자열 foo입니다. 스크립트.

ref 변수는 이름 참조 변수로 declare -n를 사용하여 선언되고 값이 foo는 해당 선언의 값으로 제공됩니다. 즉,이 시점부터 변수가 범위를 벗어날 때까지 ref 변수의 사용은 foo. ref 변수는이 시점에서 foo를 참조하는 이름 참조 변수 입니다.

이렇게하면 선언 다음 줄에서 수행 한 것처럼 ref에 값을 할당하면 값이 foo에 할당됩니다.

hello 값은 스크립트 주요 부분의 $foo에서 사용할 수 있습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다