code

루프가 종료된 후 변수를 루프하고 보존하는 동안 Bash에 입력을 파이프로 연결하는 방법

starcafe 2023. 5. 3. 21:36
반응형

루프가 종료된 후 변수를 루프하고 보존하는 동안 Bash에 입력을 파이프로 연결하는 방법

Bash는 다음을 사용할 수 있습니다.cat <(echo "$FILECONTENT")

Bash는 다음을 사용할 수도 있습니다.while read i; do echo $i; done </etc/passwd

이전 두 가지를 결합하는 데 사용할 수 있습니다.echo $FILECONTENT | while read i; do echo $i; done

마지막 문제는 하위 셸을 생성하고 루프가 종료된 후 변수를 생성한다는 것입니다.i더 이상 액세스할 수 없습니다.

제 질문은:

이러한 목표를 달성하는 방법:while read i; do echo $i; done <(echo "$FILECONTENT")또는 다른 말로:어떻게 확신할 수 있습니까?i루프하는 동안 생존합니까?

다음에 진술서를 동봉하는 것을 알고 있습니다.{}그러나 이것은 문제를 해결하지 못합니다(기능에서 while 루프를 사용하고 반환하기를 원하는 경우).i가변)

프로세스 대체의 올바른 표기법은 다음과 같습니다.

while read i; do echo $i; done < <(echo "$FILECONTENT")

마지막 값i그러면 루프가 종료될 때 루프에 할당된 값을 사용할 수 있습니다.대안은 다음과 같습니다.

echo $FILECONTENT | 
{
while read i; do echo $i; done
...do other things using $i here...
}

중괄호는 I/O 그룹화 작업이며 자체적으로 하위 셸을 생성하지 않습니다.이러한 맥락에서, 그것들은 파이프라인의 일부이기 때문에 서브셸로 실행되지만, 그것은 다음과 같은 이유 때문입니다.|가 아닌{ ... }당신은 질문에서 이것을 언급했습니다.AFAIK, 함수 내부에서 반환을 수행할 수 있습니다.


Bash는 기본 제공 기능도 제공하며, 다양한 옵션 중 하나는 다음과 같습니다.

lastpipe

설정되어 있고 작업 제어가 활성화되지 않은 경우 셸은 현재 셸 환경에서 백그라운드에서 실행되지 않는 파이프라인의 마지막 명령을 실행합니다.

따라서 스크립트에서 이와 같은 것을 사용하면 수정됩니다.sum루프 후에 사용 가능:

FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe   # Comment this out to see the alternative behaviour
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum

명령줄에서 이 작업을 수행하면 일반적으로 '작업 제어가 활성화되지 않음'(즉, 명령줄에서 작업 제어가 활성화됨)을 위반하게 됩니다.스크립트를 사용하지 않고 테스트하지 못했습니다.

또한 개러스 리스가 그의 대답에서 언급했듯이, 당신은 때때로 여기서 문자열을 사용할 수 있습니다.

while read i; do echo $i; done <<< "$FILECONTENT"

이것은 필요하지 않습니다.shopt프로세스를 사용하여 프로세스를 저장할 수 있습니다.

Jonathan Leffler는 프로세스 대체사용하여 원하는 작업을 수행하는 방법을 설명하지만, 다른 가능성은 여기서 문자열을 사용하는 것입니다.

while read i; do echo "$i"; done <<<"$FILECONTENT"

이렇게 하면 프로세스가 저장됩니다.

이 함수는 $Num배의 jpg 파일을 복제합니다(배시).

function makeDups() {
NUM=$1
echo "Making $1 duplicates for $(ls -1 *.jpg|wc -l) files"
ls -1 *.jpg|sort|while read f
do
  COUNT=0
  while [ "$COUNT" -le "$NUM" ]
  do
    cp $f ${f//sm/${COUNT}sm}
    ((COUNT++))
  done
done
}

언급URL : https://stackoverflow.com/questions/19570413/how-to-pipe-input-to-a-bash-while-loop-and-preserve-variables-after-loop-ends

반응형