代码之家  ›  专栏  ›  技术社区  ›  Vi.

如何将命令行参数“序列化”和“反序列化”到字符串或从字符串中提取参数?

  •  4
  • Vi.  · 技术社区  · 15 年前

    我称我的剧本为:

    $ ./script 'a!#*`*&
    ^$' "sdf sdf\"qw sdsdf" 1 -- 2 3
    

    1: a!#*`*&
    ^$
    2: sdf sdf"qw sdsdf
    3: 1
    4: --
    5: 2
    6: 3
    

    如果我需要在本地调用具有相同参数的对象,我可以这样做:

    someprogram "$@"
    

    但我如何将所有数组放到一个字符串中(存储在文件或环境变量中,或通过TCP eaisly传递),然后将其返回到某个命令行参数?我希望它简单、简短、安全。

    export CMDLINE="$@"
    # What is in CMDLINE now? Escaped or not?
    
    sh -c "someprogram $CMDLINE"
    # Will it do what I mean?
    

    [a-zA-Z0-9_]* 字符串,另一个将其返回到我可以使用的命令行参数。

    更新:写了两个版本的脚本对。哪个更有用?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Vi.    15 年前

    创建了两个脚本:一个将其参数序列化为 [a-ZA-Z0-9=_]* http://vi-server.org/vi/bin/serialize.sh ,其他启动此命令行(带有可选的前置参数) http://vi-server.org/vi/bin/deserialize.sh .

    #!/bin/bash
    n=$#;
    for ((i=0; i<$n; ++i)); do
        if [ -z "$1" ]; then
            echo 1
        else
            printf '%s' "$1" | base64 -w 0
            echo
        fi
        shift
    done | tr '\n' '_'
    echo -n "0"
    

    反序列化:

    #!/bin/bash
    if [ -z "$1" ]; then
        echo "Usage: deserialize data [optional arguments]"
        echo "Example: \"deserialize cXFx_d3d3_0 eee rrr\""
        echo "    will execute \"eee rrr qqq www\""
        exit 1;
    fi
    
    DATA="$1"; shift
    
    i=0
    
    for A in ${DATA//_/' '}; do
        if [ "$A" == "0" ]; then 
        break;
        fi              
        if [ "$A" == "1" ]; then 
        A=""
        fi              
        ARR[i++]=`base64 -d <<< "$A"`
    done
    exec "$@" "${ARR[@]}"
    

    例子:

    deserialize `serialize qqq www` echo
    
        2
  •  0
  •   Vi.    15 年前

    与另一个答案中的Bash脚本不兼容

    将命令行参数序列化到的脚本 [a-zA-Z0-9=_]* 字符串: http://vi-server.org/vi/bin/serialize

    #!/usr/bin/perl
    use MIME::Base64;
    map {print encode_base64($_,'')."_" } @ARGV;
    

    反序列化它的脚本(可选地在其他参数前面加上前缀): http://vi-server.org/vi/bin/deserialize

    #!/usr/bin/perl
    use MIME::Base64;
    if($#ARGV<0) {
        print << "EOF";
    Usage: deserialize data [optional prepended arguments]
    Example: deserialize \$(serialize 3 4 " 5 " "" "'6'" '`8`') echo 1 2
    EOF
        exit
    }
    my @A = map {decode_base64($_)} split '_', shift @ARGV;
    exec (@ARGV,@A);
    

    http://vi-server.org/vi/bin/envserialize http://vi-server.org/vi/bin/envdeserialize