2016-08-31 2 views
1

임베디드 디바이스 중 하나에서 busybox로 작성된 쉘 스크립트를 얻으려고합니다. 문제의 원인이되는 줄은 아래에 있으며 쉘에 -x 플래그를 사용하여 실행 한 결과가 포함되어 있습니다.이 쉘 명령어의 문제점

if [ cut -d : -f 1-3 /sys/class/net/eth0/address | grep -q -i 01:02:03 ]; then 
    # Do stuff 
fi 

를 실행하려고 할 때 주어진 출력 : 내가 원래 작동을 중지 할 때 나도 몰라 그래서 스크립트를 작성하지 않은

# sh -x ./script 
+ [ cut -d : -f 1-3 /sys/class/net/eth0/address 
sh: missing ] 
+ grep -q -i 01:02:03 ] 
grep: ]: No such file or directory 
+ sync 

. 그것은 비교에 사용되는 명령 (맥 주소 접두사가 주어진 샘플과 일치한다면 1을, 그렇지 않으면 0을 반환해야 함)가 제대로 실행되지 않는 것 같지만 명령을 분리하려고하는 이유를 모르겠습니다. .

+2

'if'조건이 절대로 작동하지 않았을 것입니다. 'cut '자체는 명령이며'['명령을위한 옵션이 아닙니다. 명령 파이프 라인을'if'의 조건으로 사용하려면 대괄호를 버리십시오. 그리고 비 비지 박스 시스템에서, 더 많은 지혜를위한'남자 테스트 '. – ghoti

답변

7

[은 구문처럼 사용하는 반면, 쉘에서는 전달할 특정 인수가 필요한 명령입니다. 리턴 코드를보고 쉘에서

if cut -d : -f 1-3 /sys/class/net/eth0/address | grep -q -i 01:02:03; then 

, if 작품 :

나는 수정이 (마지막 인수가 [ 예상하는이 있음) [를 제거하고 ] 해당하는 것만 큼 간단해야한다고 생각 이 명령이 [이든 다른 명령이든 상관 없습니다.

덧붙여서,에 대한 -i 옵션은이 경우 유용하지 않은 것으로 생각하므로 제거 할 수 있습니다. 당신의 상태를 간단하게 할 수


주 (감사 chepner하기) :

if grep -q '^01:02:03(:|$)' /sys/class/net/eth0/address; then 

일치하는 부분 다음 라인의 시작을, 당신은 이미, 콜론 또는 말 중 하나에 의해 따랐다 줄의. 또한

:

if [ "$(cut -d : -f 1-3 /sys/class/net/eth0/address)" = 01:02:03 ]; then 

오히려 grep으로하는 배관보다, 잘라 내기 명령의 출력에 직접적인 문자열 비교를 수행합니다.

+0

시도해 보니 매력처럼 작동합니다. 감사! – RobbG

+1

''grep -q '^ 01 : 02 : 03 (: | $)'/ sys/class/net/eth0/address 중 하나 인'cut' 명령 자체는 꼭 필요한 것은 아닙니다. 그때 충분하다. – chepner

+1

또는 단순 텍스트 비교를 위해'grep'을 버리십시오 :'[ "$ (cut -d : -f 1-3/sys/class/net/eth0/address)"= 01:02:03]; 그때'. – chepner