处理用户输入

处理用户输入

       从用户处获取数据的方法包括:

l  命令行参数(添加在命令后面的数据值);

l  命令行选项(修改命令行为的单字符值);

l  直接读取键盘输入。

11.1 命令行参数

11.1.1 读取参数

       bash shell将在命令行中输入的所有参数赋值给一些特殊变量,这些变量称为位置参数(positional parameter)。其中还包括shell执行的程序的名称,位置参数通过标准数字表示,其中$0$1$2$3$4$5$6$7$8$9为前10个参数,$0为程序名称。$1为第一个参数。

       不过需要注意的是,如果要传递一个包含空格的文本字符串,则会出现问题,此时我们需要用引号括起来(单引号双引号都可以)。

       如果脚本需要的参数多于9个,那么可以继续在命令行中添加命令行参数,但是变量名称稍有变化,在第9个变量之后,必须使用大括号将变量括起来如${10}

11.1.2 读取程序名称

       $0其实是程序的完整路径,而不仅仅是程序的名称,如果希望得到程序的名称,可以使用name=`basename $0`

11.1.3 测试参数

       当脚本认为参数变量中包含数据,但实际上其中并没有数据时,极有可能会生成脚本错误消息。这种编写脚本方法很不好,好的方法是对参数进行检查来保证使用参数前确实存在数据

11.2 特殊的参数变量

11.2.1 参数计数

       特殊变量$#中存储执行脚本时包含的命令行的参数个数。

11.2.2 获取所有数据

       变量$*$@包含所有的命令行参数。

       区别是变量$*将所有参数视为一个单吃,而变量$@分别对待每个参数。

11.3 移位

       可以使用shift来改变命令行参数的相对位置。比如shift n就表示n次左移,第n个参数变为第一个参数,注意将某一个参数移位掉后,该参数值就丢失了

11.4 处理选项

11.4.1 找出选项

       shell使用双破折号指示选项列表的结束。如果发现双破折号,脚本就能够安全的将剩下的命令行参数作为参数而不是选项处理。

11.4.2 使用getopt命令

       getopt命令可以接受任意形式的命令行选项和参数列表,并自动将这些选项和参数转换为适当的格式。命令格式如下:

       getopt options optstring parameters

       选项字符串optstring是处理的关键,它定义命令行中的有效选项字母。它还定义那些选项字母需要参数值。

       首先,在选项字符串中列出将在脚本中用到的每个命令行选项字母。然后,在每个需要参数值选项字母后面放置一个冒号Getopt命令根据定义的选项字符串解析提供的参数。

       如果指定的选项不包含在选项字符串中,getopt命令会默认生成一个错误消息。可以使用-q选项忽略这个错误消息。但是注意,getopt命令选项必须在选项字符串的前面,比如-q的使用为getopt –q options optstring parameters,不然会被当做选项参数。

       Shell中使用getopt的方法为:

       set — `getopts –q ab:cd “$@”`

11.4.3 更高级的getopts命令

       getopts命令顺序的对现有的shell参数变量进行处理,而不像getopt为在命令行中找到的所有待处理选项和参数生成一个输出。

       每调用一次getopts,它值处理在命令中检测到的参数中的一个。处理完所有参数后,以大于零的退出状态退出,因此,getopts非常宜用在循环中解析所有命令行参数。

       getopts命令使用两个环境变量,OPTARG包含需要参数值的选项要使用的值,OPTIND包含的值表示getopts停止处理时在参数列表中的位置。

11.5 标准化选项

随着时间的推移,一些字母的含义已经成为一种默认的约定,遵循最小立异性原则,应该掌握这种常识。

选项

描述

-a

allls -a)显示所有对象

append

-b

set buffer/block size du

-d

debug

directoryls -d)指示目录

delete

diffrent

-D

definegcc -Dmac

-e

executesed -e ‘command’ -e ‘command1’

exclude

expression 展开对象

-f

filegrep -f file)指定读取数据的文件

forcerm -rf

-h

headerps

help 显示命令的帮助信息

-i

initialize

ignore 忽略大小写

ineractiverm -i

-I

includegcc -Ipath

-k

keeppasswd, bzip, fetchmail

kill

-l

listls -l)生成长格式输出

loadgcc -llib

-m

messagegit commit -m

-n

numberhead -n 1

-o

outputwget

-p

portssh

protocolfetchmail

-q

quitemake)以quiet模式执行

-rR

recursecp)递归处理

reversesort

-s

slientfetmail)以slient模式执行

subjectmail, mutt

size

-t

tagvi

-u

userps, fetchmail

-v

verbosetar, cp, cat

versionpatch

-V

versiongcc, hostname

-w

widthod

warningflex

-x

启用调试 -d

-y

yesyum update -y)设置所有提问的回答为yes

-z

启用压缩(bzip, tar

 

11.6 获取用户输入

11.6.1 基本读取

       read命令接收标准输入或其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中。

       read可以跟一个-p选项,允许在read命令行中指定一个提示。

11.6.2 计时

       使用read后,脚本很可能会停下来一直等待脚本用户输入数据。此时,可以使用-t选项指定一个计时器,-t选项指定read命令等待输入的秒数,当计时器时数满时,read命令返回一个非零退出状态。

       例如 read –t 5 –p “Please input your name : ” name

11.6.3 默读

       比如输入密码,不希望输入的数据显示在监视器上,可以使用-s选项。实际上数据还是显示的,只是read命令将文本颜色设置成了与背景颜色相同的颜色。

11.6.4 读取文件

       使用read命令读取linux系统上存储在文件中的数据,每调用一次read命令,都会读取文件中的一行文本,当文件中没有可读的行时,read命令将以非零退出状态退出。

       较好的方法:cat file | while read line