问题背景

在Linux中我们会使用到shell,来完成输入参数的获取,就如同下面的形式,这种形式在进行多语言编程和调用有着非常重要的作用

sh test_params   

一、传递的过程

1.1 原理模型如下:

1.1.1 可执行sh文件中调用C文件

1.1.2 可执行c文件中调用sh文件

1.2 从shell调用c

根据上述的模型可以知道,通过在shell中加入c程序的编译运行命令,如[gcc -o filename filename.c]来完成编译,使用命令[./filename]来进行调用

代码:

下面的代码就是运行编译后的hello.c产生的hello文件和对new.c文件的编译和运行,new.c中是一个输入三个数实现求和运算

echo ./hello
gcc -o new new.c
./new

结果:

1.3 从c中调用shell

使用读取shell的文件来完成数据的获取

if((stream = popen("sh test_adjust.sh", 'r')) == NULL){
fprintf(stderr, "%s", strerror(errno));
return -;
}
int i = ;
while (fgets(buf, sizeof(buf), stream) != NULL){
a[i] = (int)buf[] - ;
i++;
}

二、 带有参数的传递

在c中调用sh文件获取参数之前,先让sh从命令行获取参数

2.1 shell获取参数

shell脚本的参数传递,通过$+n来获取第几个参数,0是特殊的参数,是获取脚本的名称

代码:

echo $
echo $
echo $
echo $
echo $
echo $
echo $
echo $
echo $
echo $

结果:

2.1.1 不输入参数的调用

在shell中使用$0——$n来获取参数,0代表脚本,其他的就是依次获取参数,在不指定的情况下会输入减一位的值

2.1.2 参数输入和位置获取不对应

如果有输入就要和位置对应起来,否则会默认输出$后面的值

2.1.3 按位置输入获取

按照对应的位置输入就会出现对应位置的值

2.2 利用c调用shell命令获取shell的参数

上述讲述了如何利用[sh <filename>.sh param_0 param_1 ... ]来获取命令行对sh文件的参数输入获取,在c中如何进行调用sh脚本,代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
int main(){
char buf[];
FILE *stream = NULL;
int a[];
int ret;
memset(buf, , sizeof(buf));
if((stream = popen("sh test_adjust.sh 3 5 8", 'r')) == NULL){ //关键位置
fprintf(stderr, "%s", strerror(errno));
return -;
}
int i = ;
while (fgets(buf, sizeof(buf), stream) != NULL){
a[i] = (int)buf[] - ; // 扣掉的48是0的ASCII码
i++;
}
printf("the sum of number:%d\n",a[] +a[] +a[]);
ret = atoi(buf);
if (ret){
printf("command execute succeed!\n");
} else {
printf("command execute fail!\n");
}
return ;
}

结果

从上述的代码我们就实现从c语言中输入参数给shell,在将shell输出的参数获取到进行一个处理。最后可以将这个写入shell作为一个脚本

三、总结

介绍了如何在将命令行的参数给shell,c语言如何获取shell的参数,在用shell将其封装起来。内容类似递归,但是在我们实际使用中很重要。我们需要在一段代码中引入其他语言的内容,就会出现由于编译器的问题无法解析这段代码,此时我们就需要利用命令行来完成这段代码的解析。举一个例子在web开发中,利用PHP搭建一个web后端,但是由于数据处理方面PHP并不是很适合,此时我们使用的是python,因为无法直接在PHP中对python语法进行编译运行,就需要使用命令行调用python文件,获取输出结果(如下图)。这就是一个很常见的应用场景之一。shell调用c也是一样的,将其封装起来,使用shell可以快速完成复杂的调用过程,这个过程就是利用数据进行驱动的。

c获取shell中的参数的更多相关文章

  1. 如何获取url中的参数并传递给iframe中的报表

    在使用报表软件时,用户系统左边一般有目录树,点击报表节点就会在右侧网页的iframe中显示出报表,同时点击的时候也会传递一些参数给网页,比如时间和用户信息等.如何使网页中的报表能够获取到传递过来的参数 ...

  2. 使用JS,获取URL中指定参数的值

    /** * 获取URL中指定参数的值 * * @param name 参数名称 * @returns */ function getQueryString(name) { var reg = new ...

  3. APPCAN开发笔记:html页面之间的参数传递:使用js获取url中的参数,以及在APPCAN中不能使用的解决方法

    用PHP的GET/POST方式来传递方式已经是司空见惯了,但是如果我的页面是一个静态的html的页面,想传递参数的时候要怎么办呢?在APPCAN的开发中我们会经常遇到这样的问题,因为所有的页面都是静态 ...

  4. javaScript获取url中的参数

    var urlTools = { //获取RUL参数值 getUrlParam: function(name) { /*?videoId=identification */ var params = ...

  5. vue中如何不通过路由直接获取url中的参数

    前言:为什么要不通过路由直接获取url中的参数? vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接 ...

  6. 获取url中的参数\+发送ajax请求根路径|+获取复选框的值

    //获取url中的参数function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "=( ...

  7. js获取url中的参数对象、js生成带参数的url

    // 获取url中的参数,并返回一个对象 $.getRequestData = function() { var url = location.search; //获取url中"?" ...

  8. 用JS获取地址栏中的参数的简易方法

    这个方法用起来超级简单,传入参数即可直接获取地址栏中的参数 代码如下 function GetQueryString(name) { var reg = new RegExp("(^|&am ...

  9. JavaScript获取地址栏中的参数

    JavaScript获取地址栏中的参数 1.获取地址栏中的参数 (1)若地址栏中的地址是: http://10.124.36.56:8080/CMOD/index.jsp?name=you&p ...

随机推荐

  1. .netcore之DI批量注入(支持泛型) - xms

    一旦系统内模块比较多,按DI标准方法去逐个硬敲AddScoped/AddSingleton/AddTransient缺乏灵活性且效率低下,所以批量注入提供了很大的便捷性,特别是对于泛型的服务类,下面介 ...

  2. NOIP 模拟17

    最近状态有些不对劲,总是出现各种各样的小错误...... 这次可以说是很水的一套题(T3神仙题除外),T1就是一个优化的暴力,考场上打了一个n的四次方的程序,在距考试结束还有5分钟的时候猜想出来正解, ...

  3. NLP-BM25算法理解

    前两天老师给我们讲解了BM25算法,其中包括由来解释,以及算法推导,这里我再将其整理,这里我不讲解之前的BIM模型,大家有兴趣可以自行了解.Okapi BM25:一个非二值的模型bm25 是一种用来评 ...

  4. 009-2010网络最热的 嵌入式学习|ARM|Linux|wince|ucos|经典资料与实例分析

    前段时间做了一个关于ARM9 2440资料的汇总帖,很高兴看到21ic和CSDN等论坛朋友们的支持和鼓励.当年学单片机的时候datasheet和学习资料基本都是在论坛上找到的,也遇到很多好心的高手朋友 ...

  5. Hadoop4-HDFS分布式文件系统原理

    一.简介 1.分布式文件系统钢结构 分布式文件系统由计算机集群中的多个节点构成,这些节点分为两类: 主节点(MasterNode)或者名称节点(NameNode) 从节点(Slave Node)或者数 ...

  6. python的基础认识

    一.python的简介    python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Python这个名 ...

  7. (转)白话数字签名(2)——软件&设备

    然而它太慢了 非对称加密算法有一个重大缺点——加密速度慢,或者说得更拽一些,编码率比较低.例如在上一篇里我给Clark传的那个1GB的小电影,进行非对称加密足足用了66小时.那个借条小一些吧,也用了将 ...

  8. java编程思想第四版第十章总结

    1. 内部类的特性 他允许你把一些逻辑相关的类组织在一起. 2. 使用.this 如果你需要在内部类中堆外部类进行应用,可以使用外部类的名字后面加.this.下面展示了如何使用 .this packa ...

  9. nyoj 101-两点距离 (数学)

    101-两点距离 内存限制:64MB 时间限制:3000ms 特判: No 通过数:27 提交数:74 难度:1 题目描述: 输入两点坐标(X1,Y1),(X2,Y2)(0<=x1,x2,y1, ...

  10. [springboot 开发单体web shop] 8. 商品详情&评价展示

    上文回顾 上节 我们实现了根据搜索关键词查询商品列表和根据商品分类查询,并且使用到了mybatis-pagehelper插件,讲解了如何使用插件来帮助我们快速实现分页数据查询.本文我们将继续开发商品详 ...