Linux

/bin/sh 中的部分匹配字元串

  • January 28, 2021

有人可以向我解釋為什麼這不部分匹配 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 語句中呼叫,否則它不會替換變數。

首先,$($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

由於您使用的是 BusyBox (ash shell),因此問題似乎是您的腳本使用了 shell ( [[...]]) 無法辨識的構造。此外,"$($mac)"應改為$mac.

這是一個可以在 BusyBox 上執行的更正版本(作為尾巴火花兔耳答案的替代品):

#!/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*}" ]最大可能部分時,檢查結果字元串是否為空。$mac``f0:79:60*

引用自:https://unix.stackexchange.com/questions/630512