bash에서 변수 내보내기가 작동하지 않습니다


1

아래 코드는 bash에서 작동하지 않습니다 .sh에서 작업하면 파이프를 읽은 후에 넣는 것과 같은 많은 해결 방법을 시도했지만 작동하지 않았습니다. 변수는 내보내지지 않습니다. 누구나해야 할 일을 제안 할 수 있습니까?

 function() {
 RECORD = $1
 echo "$RECORD"|read var1 var 2 var3
 var1=`echo $var1`
 var2 =`echo $var2`
 var3=`echo $var3`
 export var1 var2 var3
 }
 ....
 while read EACH_RECORD
 do
 function "EACH_RECORD"
 *action on fecthed variables*

답변:


4

여기에는 많은 실수가 있습니다. 순서대로 살펴 보겠습니다.

RECORD = $1

=쉘 지정에서 공백은 허용되지 않으므로이 지정 (및 이후의 여러 지정)은 작동하지 않습니다. 이것이 실제로하는 것은 RECORD"="로 이름이 지정된 명령 $1을 인수 로 실행하는 것 입니다. 쉘 공간은 매우 중요합니다. 대부분의 장소에서 그들은 완전히 요구되거나 완전히 금지되어 있습니다. 선택 사항이 어디인지 알게 될 때까지 작업중 인 모든 예제에서 공백을 정확하게 복사하십시오.

echo "$RECORD"|read var1 var 2 var3

파이프 라인의 요소 (예 : read여기 명령)는 서브 쉘에서 실행됩니다. 즉, 변수에 지정된 변수는 서브 쉘에서 발생하고 서브 쉘이 종료되면 손실됩니다. 또한 변수 이름 ( var 2) 중간에 공백을 둘 수 없습니다 .

파이프 없이이 작업을 수행 할 수 있습니다

read var1 var2 var3 <<<"$RECORD"

( <<<이것은 bashism이며 모든 쉘에서 사용 가능한 것은 #!/bin/bash아닙니다 #!/bin/sh. NOT으로 스크립트를 시작하십시오 .)

 var1=`echo $var1`
 var2 =`echo $var2`
 var3=`echo $var3`

두 번째 줄에서 스트레이 공간을 제거한 후에도 유용한 기능은 없습니다. 변수 값을 가져 와서 반향하고, 반향 명령의 출력을 캡처하여 변수에 다시 넣습니다. 와일드 카드 확장과 같은 변경 사항이있을 수 있지만 원하는 변경 사항이 아니라고 확신합니다. (실제로, 예기치 않은 와일드 카드 확장 및 단어 분리와 같은 것을 방지하기 위해 변수 참조를 항상 큰 따옴표로 묶어야합니다.) 따라서 이들을 잃어 버리십시오.

export var1 var2 var3

export이 쉘에서 실행되는 명령에 해당 변수의 값을 내보낼 수있는 쉘을 알려줍니다 - 즉, 그들은 수출받을 내려 하지, 프로세스 계층 구조를 이 실행 무엇이든합니다. 그러나이 경우 함수는 스크립트의 주요 부분과 동일한 프로세스에서 실행되므로 변수를 어느 방향으로나 공유하기 위해 가져 오기가 필요하지 않습니다. 변수가 선언되지 않는 local한 나머지 스크립트에서 자동으로 사용할 수 있습니다. 따라서 이것을 잃어 버리십시오.

(프로세스 계층 구조로 변수를 내보낼 수있는 방법은 없습니다. 서브 쉘 또는 다른 서브 프로세스에서 발생하는 사항은 해당 서브 프로세스에 남아 있습니다.)

 function "EACH_RECORD"

$앞에 가 필요 EACH_RECORD하거나 리터럴 문자열로 전달됩니다.

BTW, shellcheck.net을 통해 스크립트를 실행하는 것이 좋습니다 . 문제가 발생하기 전에 많은 기본 실수를 지적합니다.


명확성, 교훈 기술, 인내심 +1.
MariusMatutiae
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.