你能在Bash脚本案例陈述中使用正则表达式“xyz *)”

时间:2011-10-13 18:27:37

标签: bash

我正在挖掘mysql_safe(试图添加一些选项),我遇到了这种用于从Launch Agent分配变量的bash脚本技术: com.mysql.mysqld.plist(我在Mac上)。

现在mysqld_safe不知道它是由LaunchCtl调用的,所以我假设LaunchCtl将任何选项转换为命令行参数,但我发现这个sytnax很难入侵。 有谁知道这是如何工作的?

我理解Bash中Case / Switch的基础知识:

case "$myval" in
  switch1) do something;;
  switch2) do something;;
        *) do whatever fallthrough logic;;
esac      

使用*默认下降 在下面的脚本块中,arg值为:        “--basedir =”或“--datadir =”或“--pid-file =”等 但那里的*是什么? 这是Switch语句中的正则表达式吗? 带有后援?

for arg do
  # the parameter after "=", or the whole $arg if no match
  val=`echo "$arg" | sed -e 's;^--[^=]*=;;'`
  # what's before "=", or the whole $arg if no match
  optname=`echo "$arg" | sed -e 's/^\(--[^=]*\)=.*$/\1/'`
  # replace "_" by "-" ; mysqld_safe must accept "_" like mysqld does.
  optname_subst=`echo "$optname" | sed 's/_/-/g'`
  arg=`echo $arg | sed "s/^$optname/$optname_subst/"`
  arg=`echo $arg | sed "s/^$optname/$optname_subst/"`
  case "$arg" in
    # these get passed explicitly to mysqld
    --basedir=*) MY_BASEDIR_VERSION="$val" ;;
    --datadir=*) DATADIR="$val" ;;
    --pid-file=*) pid_file="$val" ;;
    --plugin-dir=*) PLUGIN_DIR="$val" ;;
    --user=*) user="$val"; SET_USER=1 ;;
    ...
    ...
    *)
      if test -n "$pick_args"
      then
        append_arg_to_args "$arg"
      fi
      ;;
  esac

2 个答案:

答案 0 :(得分:5)

它们不是正则表达式;它们是文件名扩展模式,也称为“globs”。

*匹配零个或多个任意字符,?匹配任何单个字符。

有关详细信息:http://www.gnu.org/s/bash/manual/bash.html#Pattern-Matching

答案 1 :(得分:3)

如果您有最新版本的bash,则可以使用真正的正则表达式来解析arg,并访问捕获组的bash数组BASH_REMATCH:

for arg; do
    if [[ $arg =~ ^--([^=]+)=(.*) ]]; then
        optname=${BASH_REMATCH[1]}
        val=${BASH_REMATCH[2]}
        optname_subst=${optname//_/-}
        case "$optname" in 
            basedir) MY_BASEDIR_VERSION="$val" ;;
            datadir) DATADIR="$val" ;;
            ...
        esac
    else
        do something with non-option argument
    fi
done