我正在挖掘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
答案 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