외부 스크립트를 증가시키기 위해 아래 함수를 사용하고 있습니다. 이것의 주요 목적은 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
원하는 것을 얻을 수 있다고 생각합니다. 스크립트 는 전체 표준 입력과 일치하고 이를 출력 의 세 번째 필드 (stdin에서) 가 뒤따르는 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