개행 문자가 내 while 조건을 엉망으로 만드는 이유는 무엇입니까?

개행 문자가 내 while 조건을 엉망으로 만드는 이유는 무엇입니까?

한 가지 방법으로 작성하면 변수를 설정할 수 있지만 다른 방법으로 작성하면 변수를 설정할 수 없는 while 루프가 있습니다. 왜 그런 겁니까? var를 1234로 인쇄하고 var2는 인쇄하지 않습니다.

#!/bin/bash

var=1234

while var=9876 var2=765 read line
do

    echo $var $var2
    echo $line

done <datafile

echo out of loop $var

var를 9876으로 인쇄하고 var2를 인쇄합니다.

#!/bin/bash

var=1234

while 
var=9876 
var2=765 
read line
do

    echo $var $var2
    echo $line

done <datafile

echo out of loop $var

답변1

두 번째 예에서는 var와 var2를 서로 다른 줄에 배치하여 명령을 다음과 동일하게 만듭니다.

while var=9876; var2=765; read line

while명령을 사용하면 do-while 루프에서 명령을 실행하기 전에 명령 목록을 표시할 수 있습니다.    help while이것을 보여주세요:

while: 동시에 명령을 실행합니다. done
  테스트가 성공하는 동안 명령을 실행합니다. COMMANDS   는 'while' COMMANDS의 마지막 명령 종료 상태가 0인
  동안 확장되어 실행됩니다.   종료 상태: 마지막으로 실행된 명령의 상태를 반환합니다.

반면에 변수 할당이 명령 앞에 있고(이 경우 read) 할당 뒤에 공백만 있는 경우 변수의 범위는 명령의 로컬 범위뿐입니다! (내부)...

바라보다:  'IFS= read..'인 동안 IFS가 아무런 효과가 없는 이유는 무엇입니까?

답변2

나는 bash가 이런 일을 할 수 있다는 것을 몰랐습니다. 게시해 주셔서 감사합니다.

이것이 나의 설명이다.

첫 번째 스크립트의 다음 줄은 다음과 같습니다.

while var=9876 var2=765 read line 

실제로 "var"라는 환경 변수를 "9876" 값으로 설정하고 "var2"라는 다른 환경 변수를 "765" 값으로 설정합니다.그러나 명령에만 해당read line. 이것은 이상한 오래된 쉘 "기능"입니다. 이것이 echo $var $var2바로 줄이 "1234"를 인쇄하는 이유입니다. "var"라는 이름의 환경 변수는 read line.

두 번째 스크립트에서는 변수 할당이 read line서로 다른 줄에서 발생하는데, 루프를 통해 매번 "var" 및 "var2"라는 쉘 변수가 할당되는 것 같습니다.

관련 정보