perl - 如何将 "serialize"和 "deserialize"命令行参数传入/传出字符串?

标签 perl bash serialization command-line

我调用我的脚本:

$ ./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 传递),然后将它返回到某个地方的命令行参数?我希望它简单、简短且安全。

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 个版本的脚本对。哪个更有用?

最佳答案

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

关于perl - 如何将 "serialize"和 "deserialize"命令行参数传入/传出字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3069163/

相关文章:

json - 使用 jq select 过滤 json 不起作用

linux - Bash:如何转换此文本以满足我的需要?

c++ - 如何使用cerial序列化

perl - 如何获得巨大矩阵的特征值(大小为 : 2x10^5)

perl - 如何从 Perl 访问 Oracle 数据库?

perl - 如何使用 Perl Google API 获取超过 1000 个 Google 结果?

Bash 变量查找

sorting - 在 Perl 版本 5.20 中从具有可选排序的 sub 返回 arrayref 的适当方法

c# - WCF:有没有办法删除 ExtensionData 字段?

java - 如何在 Gson 中实现 TypeAdapterFactory?