zoukankan      html  css  js  c++  java
  • SHELL脚本的基础知识4——处理用户输入

    当脚本需要与运行脚本的人员进行交互。

    bash shell提供了命令行参数(添加在命令后面的数据值)、命令行选项(修改命令行为的单字符值)和直接读取键盘输入。

    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

  • 相关阅读:
    事件类型
    事件
    节点样式
    节点
    将博客搬至CSDN
    ios开发 上传到App Store 时出错. iTunes Store Operation Failed, An Error occurred uploading to the iTunes store.
    ios开发百度高德地图经纬度相互转换的算法解析
    ios开发使用cocoapods倒入一堆的三方库之后开始崩溃了。发觉是导入极光引用的iOS10UserNotifications.framework导致的问题 Reason: image not found
    ios开发webview 的三种引用方式以及动态更新本地静态页的方法
    ios开发oc高仿京东金融白条额度余额的 ios开发水波纹 ios开发水正弦曲线波纹 ios开发雷达扫描的动画效果
  • 原文地址:https://www.cnblogs.com/steven_oyj/p/1749007.html
Copyright © 2011-2022 走看看