2017-08-09 65 views
1

分開我有一個字符串,這樣猛砸串用空格

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

我試着使用子${var#*=}獲得例如test但沒有找到一種方法來分隔空間。任何想法或我應該使用cut

+1

你不應該擺在首位這樣的字符串。它表明了一個設計缺陷。你怎麼得到的?如果它在腳本中定義,則應該重寫它以使用數組。 –

回答

1

你可以使用一個陣列:

$ var="--env=test --arg=foo" 
$ arr=($var) 
$ printf "%s\n" "${arr[@]}" 
--env=test 
--arg=foo 

其中var標記由IFS分裂(默認爲:空格,製表,換行)。如果要分割僅的空間,只需設置IFS=' '

IFS=' ' arr=($var) 
2

您可以使用BASH正則表達式:

var="--env=test --arg=foo" 
[[ $var =~ =([^ ]+) ]] && echo "${BASH_REMATCH[1]}" 

test 

使用extglob,您可以在更短的代碼做到這一點:

shopt -s extglob 
echo "${var//+(*|+([! ])=)}" 
test 
+1

這是避免分裂和通配的唯一解決方案。 –

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