/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

请注意,我需要"$($mac)"在 if 语句内部调用,否则它将不会替换变量。

答案1

由于您使用的是 BusyBox (ash shell),问题似乎是您的脚本使用了 shell 无法识别的构造 ( [[...]])。另外,"$($mac)"应改为$mac.

这是一个可以在 BusyBox 上运行的更正版本(作为 tail 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,正如 Jea 之前所说。

也只是用例声明;双括号是bash (或者可能是 zsh)(编辑:实际上自 ksh 起就可用;bash 和 zsh 也采用了它)特定的,但 shebang 只是说“/bin/sh”,而不是“bash”。

这里有两个解决方案:

  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

相关内容