외부 스크립트를 보강하기 위해 아래 함수를 사용하고 있습니다. 주요 목적은 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