여기에는 많은 실수가 있습니다. 순서대로 살펴 보겠습니다.
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을 통해 스크립트를 실행하는 것이 좋습니다 . 문제가 발생하기 전에 많은 기본 실수를 지적합니다.