猛砸串用空格

问题描述:

分开我有一个字符串,这样猛砸串用空格

var="--env=test --arg=foo" 

我试着使用子${var#*=}获得例如test但没有找到一种方法来分隔空间。任何想法或我应该使用cut

+1

你不应该摆在首位这样的字符串。它表明了一个设计缺陷。你怎么得到的?如果它在脚本中定义,则应该重写它以使用数组。 –

你可以使用一个阵列:

$ 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