/bin/sh의 부분 일치 문자열

/bin/sh의 부분 일치 문자열

이것이 macaddress와 부분적으로 일치하지 않는 이유를 누군가 나에게 설명할 수 있습니까 $mac?

#!/bin/sh

mac="f0:79:60:0f:d3:0e"

if [[ "$($mac)" = 'f0:79:60*' ]]
then
  echo "true"
else
  echo "false"
fi

if 문 내에서 호출 해야 합니다 "$($mac)". 그렇지 않으면 변수가 대체되지 않습니다.

답변1

[[...]]BusyBox(ash shell)를 사용하고 계시기 때문에 스크립트가 쉘이 인식하지 못하는 구문( )을 사용하고 있는 것 같습니다 . 또한 "$($mac)"로 변경해야 합니다 $mac.

BusyBox에서 작동하는 수정된 버전은 다음과 같습니다(Spark의 토끼 귀 답변 대신).

#!/bin/sh

mac="f0:79:60:0f:d3:0e"

if [ -z "${mac##f0:79:60*}" ]
then
    echo "true"
else
    echo "false"
fi

패턴과 일치하는 가능한 가장 큰 부분을 제거할 때 [ -z "${mac##f0:79:60*}" ]결과 문자열이 비어 있는지 확인합니다 .$macf0:79:60*

답변2

먼저 제아가 말했듯 $($mac)이 고쳐져야 한다 .$mac

또한 사용 사례 설명 중 이중 괄호는 bash(또는 아마도 zsh) 에 따라 다르지만(편집: ksh 이후 실제로 사용 가능하며 bash 및 zsh도 이를 채택함) shebang에는 "bash" 대신 "/bin/sh"만 표시됩니다.

여기에는 두 가지 해결책이 있습니다.

  1. 환경에 따라 첫 번째 줄을 #!/bin/bash, 또는 bashism을 사용하고 있음을 분명히 하기 위해 다른 것으로 바꾸십시오.#!/usr/bin/bash
  2. 다음과 같이 가장 이식성이 뛰어난 대안인 Case 문을 사용하세요.
#!/bin/sh

mac="f0:79:60:0f:d3:0e"

case "$mac" in ('f0:79:60'*)
  echo "true"
;;(*)
  echo "false"
;;esac

관련 정보