如何将字符串解析为变量?

时间:2014-12-08 15:41:23

标签: bash shell parsing arguments

我知道如何以of this SO question的方式将字符串解析为变量,例如

ABCDE-123456

变为:

var1=ABCDE
var2=123456

通过,例如,cut。我可以在一个脚本中做到这一点,没问题。

但我有几十个脚本以相同的方式解析字符串/参数(相同的参数和变量,即相同的解析策略)。 有时我需要对解析机制进行更改或添加变量

当然,我可以浏览我的几十个脚本中的每一个并手动更改解析(即使只是复制和粘贴),但这将是繁琐且更容易出错或错误。

是否有一种模块化方式来解析字符串/参数?

我想过编写一个脚本,它将字符串/ args解析为变量,然后是export s,但是export命令不能从子到父的方式工作,(反之亦然)

2 个答案:

答案 0 :(得分:1)

这样的事可能有用:

parse_it () {
    SEP=${SEP--}
    string=$1
    names=${@:2}

    IFS="$SEP" read $names <<< "$string"
}

$ parse_it ABCDE-123456 var1 var2
$ echo "$var1"
ABCDE
$ echo "$var2"
123456
$ SEP=: parse_it "foo:bar:baz" id1 id2 id3
$ echo $id2
bar

第一个参数是要解析的字符串,其余参数是作为要设置的变量传递给read的变量的名称。 (这里不引用$names是故意的,因为我们将shell将字符串拆分为多个单词,每个变量一个。有效的变量名只包含_,字母和数字,所以不用担心不需要的单词通过不引用$names)来生成拆分或路径名。该函数假定字符串使用单个“ - ”分隔符,可以通过环境覆盖。

对于更复杂的解析,您可能希望使用bash标记-g所需的自定义正则表达式declare 4或更高版本):

parse_it () {
    reg_ex=$1
    string=$2
    shift 2
    [[ $string =~ $reg_ex ]] || return
    i=1
    for name; do
        declare -g "$name=${BASH_REMATCH[i++]}"
    done
}

$ parse_it '(.*)-(.*):(.*)' "abc-123:xyz" id1 id2 id3
$ echo "$id2"
123

答案 1 :(得分:1)

我认为你真正想要的是在一个脚本中编写你的函数并将其包含在所有其他脚本中。 您可以通过source.命令包含其他shell脚本。

例如,您可以在parseString.sh

中定义解析函数
function parseString {
    ...
}

然后在任何其他脚本中,执行

source parseString.sh
# now we can call parseString function
parseString abcde-12345