用空格分隔的Bash子串

用空格分隔的Bash子串,bash,Bash,我有一根这样的绳子 var="--env=test --arg=foo" 我尝试使用substring${var#*=}来获取示例test,但没有找到分隔空格的方法。我应该使用cut吗?你可以使用数组: $ var="--env=test --arg=foo" $ arr=($var) $ printf "%s\n" "${arr[@]}" --env=test --arg=foo 其中,var中的标记由IFS分割(默认为:空格、制表符、换行符)。如果只想按空格分割,只需设置IFS='':

我有一根这样的绳子

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

我尝试使用substring
${var#*=}
来获取示例
test
,但没有找到分隔空格的方法。我应该使用
cut
吗?

你可以使用数组:

$ var="--env=test --arg=foo"
$ arr=($var)
$ printf "%s\n" "${arr[@]}"
--env=test
--arg=foo
其中,
var
中的标记由
IFS
分割(默认为:空格、制表符、换行符)。如果只想按空格分割,只需设置
IFS=''

IFS=' ' arr=($var)

您可以使用数组:

$ var="--env=test --arg=foo"
$ arr=($var)
$ printf "%s\n" "${arr[@]}"
--env=test
--arg=foo
其中,
var
中的标记由
IFS
分割(默认为:空格、制表符、换行符)。如果只想按空格分割,只需设置
IFS=''

IFS=' ' arr=($var)

您可以使用BASH regex:

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

test

使用
extglob
,您可以在更短的代码中执行此操作:

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

您可以使用BASH regex:

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

test

使用
extglob
,您可以在更短的代码中执行此操作:

shopt -s extglob
echo "${var//+( *|+([! ])=)}"
test
util linux
(应该是任何linux发行版的一部分)内置了对命令行解析的支持

在您的情况下的用法:

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
util linux
(应该是任何linux发行版的一部分)内置了对命令行解析的支持

在您的情况下的用法:

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

你一开始就不应该有这样一根绳子。这表明存在设计缺陷。你是怎么得到的?如果它是在脚本中定义的,您应该重写它以使用数组。您首先不应该有这样的字符串。这表明存在设计缺陷。你是怎么得到的?如果它是在脚本中定义的,您应该重写它以使用数组。这是唯一避免拆分和全局化的解决方案。这是唯一避免拆分和全局化的解决方案。