通过Shell命令向计算机程序传JSON思路及测试案例

3 篇文章 0 订阅
2 篇文章 0 订阅

1、介绍

1.1、Shell命令限制

在Shell命令中,特殊字符串可以引起一些问题,主要涉及到特殊字符的解释引号的使用以及命令行长度的限制。以下是一些常见的限制和注意事项:

  • 特殊字符的解释: Shell中有一些特殊字符(例如$、&、*、|等),它们在命令中具有特殊的含义。如果在参数中使用这些字符,可能需要进行适当的转义或引用,以确保Shell正确解释它们。
  • 引号的使用: 引号在Shell中用于保留参数的空格、防止变量替换等。单引号和双引号的使用方式有所不同。如果特殊字符串包含引号,需要注意正确使用引号以避免解释错误。
  • 命令行长度限制: 命令行的长度是有限制的,由系统的ARG_MAX(参数最大长度,linux控制台执行getconf ARG_MAX可以获取到)常量决定。如果命令行过长,可能会导致执行失败。在处理大量数据时,可以考虑使用脚本或其他方式传递参数。
  • 通配符展开: 如果特殊字符串中包含通配符(例如*、?),Shell会尝试进行通配符展开。如果不希望发生展开,可以使用引号防止通配符被解释。
  • 换行符: 如果特殊字符串包含换行符,可能会影响命令的执行。在命令行中使用多行参数时,需要小心处理。
  • 变量替换: 特殊字符串中的变量替换可能会导致意外的结果,特别是在双引号中进行变量替换时。使用单引号或适当的转义字符可以避免这个问题。

总体而言,对于特殊字符串的处理需要小心,根据具体情况采取适当的转义或引用方式。这有助于确保Shell正确解释参数,避免意外的行为。

1.2、Base64 介绍

Base64编码是使用64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途,Base64索引表如下:

数值字符数值字符数值字符数值字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

Base64可用于任意数据底层二进制数据编码,以应用于只能传输ASCII字符的场合。不过最常用于文本数据的处理传输,例如在MIME格式的电子邮件中,Base64可以用来编码邮件内容,方便在不同语言计算机间传输而不乱码,注意是传输不是显示,例如在西欧地区计算机上使用utf-8编码即可正常显示中文(安装有对应字库),但是它未必能正常传输中文,这时转换为Base64便无此顾虑。

1.3、传参思路

  • 思路1:首先,计算json字符串base64值,然后,将计算得到的base64值,通过shell命令行的方式传输给不同的开发语言程序,最后,不同的开发语言程序将接收到的base64值通过自己编写的程序解码便可以获取到原始的json字符串
  • 思路2:首先,计算json字符串base64值,然后,将计算得到的base64值,通过shell命令行+解码base64的方式传输给不同的开发语言程序,最后,不同的开发语言程序便可以获取到原始的json字符串后续,将以该思路举例)。

2、测试案例

准备如下json字符串数据。

{
    "整数":100,
    "浮点数":99.99,
    "布尔值":true,
    "字符串":"Hello world\n",
    "数组":[
        "张三",
        "李四",
        "王五"
    ]
}

首先,前往 Base64在线生成网站 或者 通过程序(比如:Java语言org.springframework.util.Base64Utils.encodeToString方法)获取到该json的base64值,如下所示:

ewogICAgIuaVtOaVsCI6MTAwLAogICAgIua1rueCueaVsCI6OTkuOTksCiAgICAi5biD5bCU5YC8Ijp0cnVlLAogICAgIuWtl+espuS4siI6IkhlbGxvIHdvcmxkXG4iLAogICAgIuaVsOe7hCI6WwogICAgICAgICLlvKDkuIkiLAogICAgICAgICLmnY7lm5siLAogICAgICAgICLnjovkupQiCiAgICBdCn0K

然后,在linux控制台使用echo base64值 | base64 --decode 命令行,测试是否成功解码该base64值。(注释:大多数Linux系统都支持该base64命令方式,它是一个用于进行Base64编码和解码的实用工具。base64命令通常包含在核心的GNU工具集中,因此在许多常见的Linux发行版上都是可用的)

echo ewogICAgIuaVtOaVsCI6MTAwLAogICAgIua1rueCueaVsCI6OTkuOTksCiAgICAi5biD5bCU5YC8Ijp0cnVlLAogICAgIuWtl+espuS4siI6IkhlbGxvIHdvcmxkXG4iLAogICAgIuaVsOe7hCI6WwogICAgICAgICLlvKDkuIkiLAogICAgICAgICLmnY7lm5siLAogICAgICAgICLnjovkupQiCiAgICBdCn0K | base64 --decode

2.1、shell脚本(*.sh)

新建一个文件名为test.sh,内容如下:

#!/bin/bash
# 获取第一个参数
first_argument=$1
# 打印第一个参数
echo "第一个参数是: $first_argument"

在linux控制台(Terminal)执行如下shell命令,给test.sh传入json参数

sh test.sh "$(echo ewogICAgIuaVtOaVsCI6MTAwLAogICAgIua1rueCueaVsCI6OTkuOTksCiAgICAi5biD5bCU5YC8Ijp0cnVlLAogICAgIuWtl+espuS4siI6IkhlbGxvIHdvcmxkXG4iLAogICAgIuaVsOe7hCI6WwogICAgICAgICLlvKDkuIkiLAogICAgICAgICLmnY7lm5siLAogICAgICAgICLnjovkupQiCiAgICBdCn0K | base64 --decode)"

在linux控制台(Terminal)显示结果如下:

控制台结果

2.2、java语言(*.java)

新建一个文件名为Test.java,内容如下:

public class Test {
    public static void main(String[] args) {
         System.out.println("第一个参数是:"+args[0]);
    }
}

编译Test.java源代码为Test.class文件

javac Test.java

在linux控制台(Terminal)执行如下shell命令,给Test.class传入json参数

java Test "$(echo ewogICAgIuaVtOaVsCI6MTAwLAogICAgIua1rueCueaVsCI6OTkuOTksCiAgICAi5biD5bCU5YC8Ijp0cnVlLAogICAgIuWtl+espuS4siI6IkhlbGxvIHdvcmxkXG4iLAogICAgIuaVsOe7hCI6WwogICAgICAgICLlvKDkuIkiLAogICAgICAgICLmnY7lm5siLAogICAgICAgICLnjovkupQiCiAgICBdCn0K | base64 --decode)"

在linux控制台(Terminal)显示结果如下:
控制台结果

2.3、c++语言(*.cpp)

新建一个文件名为test.cpp,内容如下:

#include <iostream>
int main(int argc, char *argv[]) {
    std::cout << "第一个参数是: " << argv[1] << std::endl;
    return 0;
}

编译test.cpp源代码为test.out文件

g++ test.cpp -o test.out

在linux控制台(Terminal)执行如下shell命令,给test.out传入json参数

./test.out "$(echo ewogICAgIuaVtOaVsCI6MTAwLAogICAgIua1rueCueaVsCI6OTkuOTksCiAgICAi5biD5bCU5YC8Ijp0cnVlLAogICAgIuWtl+espuS4siI6IkhlbGxvIHdvcmxkXG4iLAogICAgIuaVsOe7hCI6WwogICAgICAgICLlvKDkuIkiLAogICAgICAgICLmnY7lm5siLAogICAgICAgICLnjovkupQiCiAgICBdCn0K | base64 --decode)"

在linux控制台(Terminal)显示结果如下:
控制台结果

2.3、python语言(*.py)

新建一个文件名为test.py,内容如下:

import sys
# 获取命令行参数
arguments = sys.argv
print("第一个参数是:", arguments[1])

在linux控制台(Terminal)执行如下shell命令,给test.py传入json参数

python3 test.py "$(echo ewogICAgIuaVtOaVsCI6MTAwLAogICAgIua1rueCueaVsCI6OTkuOTksCiAgICAi5biD5bCU5YC8Ijp0cnVlLAogICAgIuWtl+espuS4siI6IkhlbGxvIHdvcmxkXG4iLAogICAgIuaVsOe7hCI6WwogICAgICAgICLlvKDkuIkiLAogICAgICAgICLmnY7lm5siLAogICAgICAgICLnjovkupQiCiAgICBdCn0K | base64 --decode)"

在linux控制台(Terminal)显示结果如下:
控制台结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值