/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」のみが表示されます。

これには2つの解決策があります。

  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

関連情報