루프가 종료된 후 변수를 루프하고 보존하는 동안 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
'code' 카테고리의 다른 글
Angular-cli를 사용하여 하나의 검정 규격만 실행하는 방법 (0) | 2023.05.03 |
---|---|
어셈블리 '마이크로소프트'.SqlServer.유형의 버전 10 이상을 찾을 수 없습니다. (0) | 2023.05.03 |
초기화 문자열의 형식이 인덱스 0에서 시작하는 규격과 맞지 않습니다. (0) | 2023.05.03 |
Python 3은 값을 기준으로 딕트를 정렬합니다. (0) | 2023.05.03 |
Azure 앱 서비스를 64비트로 변경하는 방법 (0) | 2023.05.03 |