Bash 함수 내 변수 생성 동작

Bash 함수 내 변수 생성 동작

외부 스크립트를 보강하기 위해 아래 함수를 사용하고 있습니다. 주요 목적은 ifconfig 및 ping 테스트 출력에서 ​​일부 데이터를 반환하는 것입니다. 추가 "파이핑"을 수행하고 다른 정보와 다시 연결하기 위해 변수를 사용하여 동일한 함수에서 설정하려고 합니다. 하지만 나는 이런 행동을 취합니다. 기본적으로 제가 하고 싶은 일은 다음과 같습니다.

    > for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f 3 | cut -d: -f2) ; do ping -c1 $i | grep packet | a=`echo $i-$(cut -d,
    -f3)` | echo $a; done  
4  
4  
4  
4

보시다시피 각 반복은 숫자 4를 반환합니다.

변수 속성만 제거하면 처음에 변수 "a"가 설정되어 있을 것으로 예상되는 출력을 얻게 됩니다.

> for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f 3 | cut -d: -f2) ; do ping -c1 $i | grep packet | echo $i-$(cut -d, -f3); done
10.0.2.15- 0% packet loss
192.168.0.2- 0% packet loss
10.0.2.100- 0% packet loss
127.0.0.1- 0% packet loss
  • 첫 번째 함수 코드 실행에서 숫자 4가 출력되는 이유는 무엇입니까?
  • 동일한 함수 내에서 변수를 설정하고 파이프 후에 다시 에코하는 방법은 무엇입니까? 그게 가능합니까?

감사합니다!

답변1

 for i in $(...) ; do ... | a=`...` | echo $a; done

첫 번째 함수 코드 실행에서 숫자 4가 출력되는 이유는 무엇입니까?

왜냐하면 a=`...`및 는 echo $a서로 다른 서브쉘/하위 프로세스에서 실행되기 때문입니다. 모든 쉘에서 인쇄 a=1; a=3 | echo $a됩니다 . 1하위 쉘에서 상위 쉘로 변수를 전달할 수 없습니다.

동일한 함수 내에서 변수를 설정하고 파이프 후에 다시 에코하는 방법은 무엇입니까? 그게 가능합니까?

캔트. 파이프 앞에 기본 스크립트에서 설정하지 않는 한.

답변2

재구성된 파이프라인의 마지막 부분을 사용하면 sed원하는 것을 얻을 수 있다고 생각합니다. 스크립트는 전체 표준 입력을 일치시키고 이를 sed출력(표준 입력의)의 세 번째 필드가 뒤에 오는 값으로 바꿉니다. 예를 들어,$i-ping

$ for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f3 | cut -d: -f2); do \
    ping -c1 $i | grep packet | cut -d, -f3 | sed "s/\(.*\)/$i - \\1/"; \
done
123.145.167.189 -  0% packet loss
127.0.0.1 -  0% packet loss

관련 정보