猛砸串用空格
问题描述:
答
你可以使用一个阵列:
$ var="--env=test --arg=foo"
$ arr=($var)
$ printf "%s\n" "${arr[@]}"
--env=test
--arg=foo
其中var
标记由IFS
分裂(默认为:空格,制表,换行)。如果要分割仅的空间,只需设置IFS=' '
:
IFS=' ' arr=($var)
答
您可以使用BASH正则表达式:
var="--env=test --arg=foo"
[[ $var =~ =([^ ]+) ]] && echo "${BASH_REMATCH[1]}"
test
使用extglob
,您可以在更短的代码做到这一点:
shopt -s extglob
echo "${var//+(*|+([! ])=)}"
test
+1
这是避免分裂和通配的唯一解决方案。 –
答
util-linux
(其中s应该是任何Linux发行版的一部分)有内置支持getopts命令行解析。
使用你的情况:
var="blub --env=test --arg=foo"
eval set -- $(getopt --longoptions env:,arg: -- $var)
while true ; do
case "$1" in
--arg)
echo "Arg is $2"
shift 2
;;
--env)
echo "Env is $2"
shift 2
;;
--) shift ; break ;;
esac
done
你不应该摆在首位这样的字符串。它表明了一个设计缺陷。你怎么得到的?如果它在脚本中定义,则应该重写它以使用数组。 –