1、命令行参数

向shell脚本传递数据的最基本方式是使用命令行参数

(1) 读取参数

读取输入的参数的变量为位置参数,位置参数通过标准数字表示,

其中$0为程序名称,$1为第一个参数,$2为第二个参数,依次类推,直到$9为第九个参数。

shell脚本自动将命令行参数赋值给各个位置变量。

同时输入多个参数(可以是数值也可以是字符串)时,必须使用空 格分隔(要想在参数值中包含空格,就必须使用单引号或双引号)

当参数多于9个后,必须在shell脚本内使用大括号将变量括起来,如${10}。从而可以使用任意个参数。

(2)读取程序名称

传递给变量$0的字符串实际上是程序的路径(根据调用方法决定是相对还是绝对路径)。

使用basename命令可以去掉路径前缀,只获得程序名称(名字中不 可以有空格)。

(3)测试脚本

当脚本认为应该包含参数,却实际上没有数据时,就会出错。

好的方法是 对参数进行检查来保证使用参数前确实存在数据,可以使用-n参数来检查。

ex: if [ –n “$1” ] then .. else .. fi

2、特殊的参数变量

用于跟踪命令行参数

(1)参数计数

使用特殊变量$#测试执行脚本时包含的命令行参 数个数。脚本中任何位置都可以使用$#

ex: if [ $# –ne 2 ] 即可测试参数个数

可 以使用${!#}来返回最后一个命令行参数(当无参数时,$#为0, 而${!#}为程序名)

(2)获取所有数据

变量$*将命令行中提供的所有参数作为一个单词处理,它将多个参数看成 一个参数。

变量$@将命令行中提供的所 有参数作为同一个字符串中的多个单词处理。允许对其中的值进行迭代(一般使用for),分隔开不同参数

3、 移位

shift命 令能够改变命令行参数的相对位置。默认将每个参数变量左移一个位置(变量$0不变,把$1丢弃,注意 不可以恢复了!)

在不清楚参数数目情况下,这是一个迭代参数的好办法

可 以为shift提供一个参数,来实现多位移变化

4、处理选项

选项是由破折号 引导的单个字母,用于更改命令的行为。

(1)找出选项

1)处理简单选项

可以使用处理命令行参数相同的方法处理选项,抽取时使用case 语句进行判断是否符合选项格式。

2)从参数中分离选项

同 时使用选项和参数时,可以使用--指示选项列表的结束。发现--后,shell就知道后面的是普通参数了,停止使用case处理选项。

3) 处理带值的选项

选项后紧跟参数值,一种方法是在case中对应选项后使用shift和读后一位参数的 方法处理。更好的方法如下:

(2)使用getopt命 令

getopt命令在处理选项和参数时 非常方便。它对参数进行重新组织,以便于解析

1)命令格式

getopt可以接受任意 形式的选项和参数列表,并自动将它们转换为适当的格式。

命令格式为: getopt options optstring parameters

选项字符串(opstring)用于定义命令行 中的有效选项字母,以及哪些选项字母需要参数值。

2)脚本中使用getopt

需要使用set命令将现有的 命令行选项和参数替换为getopt命令生成的格式化形式。

需要将原始脚本命令行参数送给getopt命令,然后将 getopt命令输出送给set命令,如下:set – `getopts –q ab:cd “$@”`

但 是getopt命令不能很好的处理带有空格的参数值,它将空格解析为参数分隔符,而不是将双引号引起来的两个值合并成一个参数。解决办 法如下:

(3)更高级的getopts命令

getopts命令顺序的对现有的shell参数变量进行处理, 每调用一次,只处理命令中检测到的参数中的一个。处理完所有参数后,以大于0的退出状态退出。

非常适宜于在循环中解析所 有命令行参数

格式为: getopts optstring variable

$OPTARG包含需 要参数值的选项要使用的值,$OPTIND包含getopts停止处理时在参数列表中的位置。

注意:当getopts处 理时,会将选项前的-去掉,所以对应的case中不需要破折号。

好的特性:

1)可以在参数值中包含空 格

2)选项字母和参数值中间可以没有空格

3)将在命令行中找到的未定义的选项都绑定为单一的输出——问号

5、标准化选项

有一些字母选项具有标准含义。最好按照标准含义定义选项意义

-a –c –d –e –f –h –i –l –n –o –q –r –s –v- x –y

6、获取用户输入

当需要在执 行过程中获得执行脚本人员的输入,使用read命 令

(1)基本读取

read命 令接受标准输入或其他文件描述符输入。读入后将数据放入一个标准变量中。

-p 允许在read命令行中直接指定一个提示。

可以指定多个变量,也可以不指定(将放置在REPLY环境变量中)

(2)计 时

使用-t指定一个计时器,计时数满还未输入,read返回一个非0的退出状态。

使 用-n指定输入的字符个数,输入达到预定数目时,就自动结束输入

(3)默读

使用 -s使输入不显示在终端(例如输入密码)

(4)读取文件

最常用的方法是使用cat命令,并通过管 道传给包含read的while语句。

ex: cat test | while read line

shell中参数的传递的更多相关文章

  1. [ 转]Shell中参数($0,$1,$#,$NF,$@等)的含义

    Shell中参数($0,$1,$#,$NF,$@等)的含义 发布时间:2018-01-19 来源:网络 上传者:用户 摘要:此处仅仅从来记录平时常用的命令的参数.以免下次忘记时及时找到.也方便更多的人 ...

  2. hibernate的dao中参数的传递取值

    hibernate的dao中参数的传递取值 private Query setParameter(Query query, Map<String, Object> map) { if (m ...

  3. js函数中参数的传递

    数据类型 在 javascript 中数据类型可以分为两类: 基本类型值 primitive type,比如Undefined,Null,Boolean,Number,String. 引用类型值,也就 ...

  4. python函数中参数的传递

    Python唯一支持的参数传递方式是『共享传参』(call by sharing)多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本类型按值传递 ...

  5. C语言中参数的传递

    普通情况: 调用函数参数的传递,是采取入栈的方式,先上图一张: Fun是被调用的函数,而为了演示其参数传递的过程,特意多设了几个参数,其传递参数的汇编代码如下: 可以看出,汇编代码中将这9个参数的前5 ...

  6. SpringMVC中参数的传递(一)

    前言 1.首先,我们在web.xml里面配置前端控制器DispatcherServlet以及字符编码过滤器(防止中文乱码),配置如下: <?xml version="1.0" ...

  7. 《从零开始学Swift》学习笔记(Day 20)——函数中参数的传递引用

    原创文章,欢迎转载.转载请注明:关东升的博客 参数的传递引用 类是引用类型,其他的数据类型如整型.浮点型.布尔型.字符.字符串.元组.集合.枚举和结构体全部是值类型. 有的时候就是要将一个值类型参数以 ...

  8. shell中参数及带色彩打印

    shell脚本中的一些函数参数说明如下: #!/bin/bash echo 显示参数的个数: $# echo 以单个字符串把每个参数连接起来: $* echo 显示脚本当前运行的进程id: $$ ec ...

  9. angularjs select标签中参数的传递

    今天做的一个demo中需要一个下拉选择框,并根据所选择的内容向服务器发送请求. 首先百度了一下angularjs关于select的使用,一种采用ng-repeat的方式. <select ng- ...

随机推荐

  1. WIN10下VS CODE 更新后拓展宿主意外终止问题解决方法(每次系统更新都要删除一次git)

    S CODE最近更新后,一打开就会出现拓展宿主意外终止的错误,点重新加载等都不好用. 出现这个问题主要是和git有关,做如下操作处理就好: 打开vscode安装文件夹->resource文件夹- ...

  2. C#的配置文件App.config使用总结

    应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是configuration. ...

  3. leetcode1013

    class Solution(object): def canThreePartsEqualSum(self, A: 'List[int]') -> bool: n = len(A) sums ...

  4. 机器学习进阶-图像特征sift-SIFT特征点 1.cv2.xfeatures2d.SIFT_create(实例化sift) 2. sift.detect(找出关键点) 3.cv2.drawKeypoints(画出关键点) 4.sift.compute(根据关键点计算sift向量)

    1. sift = cv2.xfeatures2d.SIFT_create() 实例化 参数说明:sift为实例化的sift函数 2. kp = sift.detect(gray, None)  找出 ...

  5. 【JEECG技术文档】JEECG 组织机构导入V3.7

    1.功能介绍 组织机构导入 提供组织机构模版导入功能,使用户更快速的创建组织机构 要使用组织机构导入功能需要完成以下步骤: 1. 下载模版excel 2. 填写组织机构信息 3. 点击导入-选择文件- ...

  6. day37-常见内置模块六(其他模块)

    其他内置模块 1.subprocess(系统交互)模块 2.math模块 3.zipfile模块 4.keyword模块 5....

  7. mysqldump备份时保持数据一致性

    对MySQL数据进行备份,常见的方式如以下三种,可能有很多人对备份时数据一致性并不清楚 1.直接拷贝整个数据目录下的所有文件到新的机器.优点是简单.快速,只需要拷贝:缺点也很明显,在整个备份过程中新机 ...

  8. APP-7-百度地图移动轨迹

    1.代码部分 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <me ...

  9. 25_ajax请求_使用fetch

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. kbengine:简单介绍

    之前想分析一个开源服务器很久了,思前想后,还是选择了kbengine. KBEngine的服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新).现在服务器大多数是用C++做的,pyt ...