常用的linux指令基本都支持命令行参数 例如 :

ls -l
rm -r
rm -f
cp -r

那么 这些参数都是如何去被应用程序获取的呢? 学习记录一下

1. shell 脚本

1.1 shell 脚本获得传入的参数

shell 脚本部分的数据处理是分为 传入和解析
对于参数的传入 一个简单的例子就是菜鸟教程中的例子 :

https://www.runoob.com/linux/linux-shell-passing-arguments.html
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.comecho "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

以下也是引自 菜鸟教程

关于参数解析部分 shell 的解释器提供了一个成熟的解析方法 getopts , 使用该函数你可以去解析复杂的参数。

关于这部分的总结 可以参考:

https://blog.csdn.net/wdz306ling/article/details/79974377
#!/bin/bash
# auth:    https://blog.csdn.net/wdz306ling/article/details/79974377
status=off                  #定义变量status,初始值设置为off
filename=""                 #定义变量filename,用于保存选项参数(文件)
output=""                   #定义变量output,用于保存选项参数(目录)
Usage () {                  #定义函数Usage,输出脚本使用方法echo "Usage"echo "myscript [-h] [-v] [-f <filename>] [-o <filename>]"exit -1
}while getopts :hvf:o: varname   #告诉getopts此脚本有-h、-v、-f、-o四个选项,-f和-o后面需要跟参数(没有选项时,getopts会设置一个退出状态FALSE,退出循环)
docase $varname inh)        echo "$varname"Usageexit;;v)echo "$varname"status=onecho "$status"exit;;f)echo "$varname"echo "$OPTARG"filename=$OPTARG                    #将选项的参数赋值给filenameif [ ! -f $filename ];then               #判断选项所跟的参数是否存在且是文件echo "the source file $filename not exist!"exitfi;;o)echo "$varname"echo "$OPTARG"output=$OPTARG                      #将选项参数赋值给outputif [ ! -d  $output ];then               #判断选项参数是否存在且是目录echo "the output path $output not exist"exitfi;;:)                                               #当选项后面没有参数时,varname的值被设置为(:),OPTARG的值被设置为选项本身echo "$varname"echo "the option -$OPTARG require an arguement"        #提示用户此选项后面需要一个参数exit 1;;?)                                   #当选项不匹配时,varname的值被设置为(?),OPTARG的值被设置为选项本身echo "$varname"echo "Invaild option: -$OPTARG"           #提示用户此选项无效Usageexit 2;;esac
done

1.2 shell 脚本获得环境变量

shell 脚本里面使用 环境变量就很简单了 直接 判断变量是否存在 然后打印变量名称就可以了

root@jeason:~/shell# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/xtensa-esp32-elf/bin:/usr/loacl/go/bin:/usr/local/go/bin
root@jeason:~/shell#

关于这部分 可以参考 https://blog.csdn.net/p106786860/article/details/51318467
大佬们太多了 这些知识也太常了。

2. linux 的 c 程序

2. 1 linux 的 c 程序获得 入口参数

获得 命令行参数的方法如下 :

#include <stdio.h>
int main(int argc,char *argv[])
{printf("argc = %d\n",argc);for(int i = 0; i < argc ; i++ ){printf("argv[%d] = %s\n",i,argv[i]);}printf("done !\n");return 0;
}
root@jeason:~/shell# gcc 1.c
root@jeason:~/shell# ./a.out
argc = 1
argv[0] = ./a.out
done !
root@jeason:~/shell# ./a.out a b cd e f g h i j k
argc = 11
argv[0] = ./a.out
argv[1] = a
argv[2] = b
argv[3] = cd
argv[4] = e
argv[5] = f
argv[6] = g
argv[7] = h
argv[8] = i
argv[9] = j
argv[10] = k
done !
root@jeason:~/shell#

2. 1 linux 的 c 程序获取环境变量

环境变量的获取 也是非常简单的 只需要直接引入一个全局的指针数组即可,这个指针数组会以一个nullptr进行结尾 。

#include <stdio.h>
int main(int argc,char *argv[])
{printf("argc = %d\n",argc);for(int i = 0; i < argc ; i++ ){printf("argv[%d] = %s\n",i,argv[i]);}printf("done !\n");extern char **environ;while(*environ){printf("%s\n",*environ ++);}return 0;
}
root@jeason:~/shell# gcc 1.c
root@jeason:~/shell# ./a.out a b cd e f g h i j k
argc = 11
argv[0] = ./a.out
argv[1] = a
argv[2] = b
argv[3] = cd
argv[4] = e
argv[5] = f
argv[6] = g
argv[7] = h
argv[8] = i
argv[9] = j
argv[10] = k
done !
LD_LIBRARY_PATH=:/usr/local/lib/
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
SSH_CONNECTION=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx# 保护处理
LESSCLOSE=/usr/bin/lesspipe %s %s
LANG=en_US.UTF-8
DISPLAY=localhost:11.0
S_COLORS=auto
XDG_SESSION_ID=17020
USER=root
PWD=/root/shell
HOME=/root
GOROOT=/usr/local/go
SSH_CLIENT=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx# 保护处理
LIBVIRT_DEFAULT_URI=qemu:///system
SSH_TTY=/dev/pts/2
MAIL=/var/mail/root
TERM=xterm
SHELL=/bin/bash
SHLVL=1
LOGNAME=root
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
XDG_RUNTIME_DIR=/run/user/0
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/xtensa-esp32-elf/bin:/usr/loacl/go/bin:/usr/local/go/bin
LESSOPEN=| /usr/bin/lesspipe %s
OLDPWD=/root
_=./a.out

当然 关于参数的处理和解析的部分 我这里就没有去进行演示了 可以给大家复制一个开源库的处理方案供大家参考

demo 1

 // soem 的FOE 升级demo    关于参数 可以看 usage部分的打印。
int main(int argc, char *argv[])
{printf("SOEM (Simple Open EtherCAT Master)\nFirmware update example\n");if (argc > 3){argslave = atoi(argv[2]);boottest(argv[1], argslave, argv[3]);}else{printf("Usage: firm_update ifname1 slave fname\n");printf("ifname = eth0 for example\n");printf("slave = slave number in EtherCAT order 1..n\n");printf("fname = binary file to store in slave\n");printf("CAUTION! Using the wrong file can result in a bricked slave!\n");}printf("End program\n");return (0);
}

demo 2


int main(int argc, char *argv[])
{ec_adaptert * adapter = NULL;printf("SOEM (Simple Open EtherCAT Master)\nSlaveinfo\n");if (argc > 1){if ((argc > 2) && (strncmp(argv[2], "-sdo", sizeof("-sdo")) == 0)) printSDO = TRUE;if ((argc > 2) && (strncmp(argv[2], "-map", sizeof("-map")) == 0)) printMAP = TRUE;/* start slaveinfo */strcpy(ifbuf, argv[1]);slaveinfo(ifbuf);}else{printf("Usage: slaveinfo ifname [options]\nifname = eth0 for example\nOptions :\n -sdo : print SDO info\n -map : print mapping\n");printf ("Available adapters\n");adapter = ec_find_adapters ();while (adapter != NULL){printf ("Description : %s, Device to use for wpcap: %s\n", adapter->desc,adapter->name);adapter = adapter->next;}}printf("End program\n");return (0);
}

linux学习笔记-- linux的 shell和linux C 程序 获取命令行参数和环境变量相关推荐

  1. Linux 学习笔记之超详细基础linux命令 Part 3

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...

  2. Linux 学习笔记(六):Linux

    预期学习目标 CentOS的安装 相关命令的学习 脚本的编写 定时任务的编写 vim的学习 系统设置 项目部署 项目权限设置 确认 SELinux 的状态 [root@centos7 ~]$ /usr ...

  3. Linux学习笔记 -- rpm 与 shell 编程

    目录 rpm 与 YUM rpm 包的管理 rmp 包 查询 安装 卸载 yum 安装 JDK mysql 8.0 离线安装 Centos 7 忘记mysql的root密码 Shell 编程 shel ...

  4. LINUX学习笔记:31个常用LINUX命令和相关解释

    LINUX学习笔记三: 最近在带新同事,是一个刚入行的萌新,对于linux不是很熟悉,问我怎么来学习. 所以今天接着之前的部分,继续分享一些linux学习资料.有需要的点点保存,没有跳过呗.PS:内容 ...

  5. Linux学习笔记(包含虚拟机及Linux系统安装)

    Linux学习笔记 1.1 Linux简介 1.2 Linux 的版本 1.3 Linux的应用 2.Linux的安装 2.1 虚拟机安装 2.1.1 什么是虚拟机? 2.1.2 VMware介绍 2 ...

  6. 【Linux学习笔记】 -- 基本Shell命令

    常见的目录名均基于文件系统层级标准(filesystem hierarchy standard,FHS) Linux的四个部分: 1 Linux内核:控制所有硬软件,必要时分配硬件根据需要执行软件 系 ...

  7. Linux学习笔记四--Bash Shell

    查看某一命令是否是来自于外部命令还是内置于bash中:type [-tpa] name      也可用来查找命令,如:type -p touch 有/bin/touch:type -p vbird无 ...

  8. 写得蛮好的linux学习笔记五-认识SHELL(收藏)

    认识SHELL alias    显示当前所有的命令别名      alias lm="ls -al"   命令别名    unalias lm 取消命令别名 type      ...

  9. 《Linux学习笔记——整理自马哥Linux运维》_待完成

    ls-l:长格式-:普通文件(f)d:目录文件b:块设备文件(block)c:字符设备文件(character)l:符号链接文件(symbolic link file)p:命令管道(pipe)s:套接 ...

最新文章

  1. 统计计量 | 统计学中常用的数据分析方法汇总
  2. CUDA学习(七十一)
  3. Django 连接Mysql异常处理
  4. 将Sublime Text 3设置为Python全栈开发环境
  5. VTK:PolyData之InterpolateTerrain
  6. IIS企业案例系列之七:发布Exchange OWA之SSL桥接模式
  7. 378. 有序矩阵中第K小的元素
  8. ios category类别的使用
  9. CSDN上传资源时一直提示 请填写资源tag
  10. mysql中的sql在添加的操作中,id或者是某些字段,需要它添加自带的默认值,或者我们并不想对id或者某个字段赋值
  11. 计算机专业国培总结,2016年信息技术教师国培心得体会(2篇)
  12. ps换证件照背景颜色
  13. 【hdu 6438】Buy and Resell
  14. win7 提示 由于无法验证发布者,windows阻止控件安装 解决办法
  15. 默林娱乐集团首席执行官首度访华,上海乐高乐园度假区新进展
  16. spss多因素方差分析
  17. 学习笔记:【案例】中医证型关联规则挖掘
  18. 深圳市海平线科技有限公司
  19. 几个pdf文件怎么合并为一个?
  20. 基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作

热门文章

  1. 【老保姆教程】:Tesseract-OCR图片文字识别
  2. 【PHP】 解决报错:Error: php71w-common conflicts with php-common-5.4.16-43.el7_4.x86_64
  3. android应用 数量,谷歌Android应用数量超40万 免费应用占总数2/3
  4. 数据分析-主成分分析流程(R语言)
  5. shell基础---exit用法
  6. 谈谈利用统计工具做好网站数据分析
  7. 微信 {errcode:48001,errmsg:api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]}
  8. Misc简单题目分享-CTF
  9. 网络编程和网络应用开发
  10. 修改MySQL密码策略