时间:2017-09-19注:本文部分内容摘自《Linux命令行与shell脚本编程大全》一书,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第14章学习总结第14章:处理用户输入本章内容传递参数跟踪参数移动变量处理选项标准化选项获取用户输入14.1命令行参数14.1.1读取参数bashshell一些称为positional的特殊变量参数分配给在命令行上输入的所有参数。位置参数变量是一个标准的数字$0是程序名$1是第一个参数$2是第二个参数以此类推,知道第九个参数$9写test1.sh脚本#!/bin/bashfactorial=1for((number=1;number<=$1;number++))dofactorial=$[$factorial*$number]donecho$1的阶乘为$factorial执行命令./test1.sh5编写test2.sh脚本#!/bin/bashtotal=$[$1*$2]echo第一个参数是$1.echo第二个参数是$2.echo总参数是$total。执行命令./test2.sh25编写test3.sh脚本#!/bin/bashecho你好$1,很高兴认识你。执行命令./test3.sh'RichBlum'如果脚本需要超过9个命令行参数,使用${10}获取并写入test4.sh脚本#!/bin/bashtotal=$[${10}*${11}]echo第十个参数为${10}echo第十一个参数为${11}echo总计为$total执行命令./test4.sh12345678910111214.1.2读取脚本名使用$0参数在命令行获取shell启动的脚本名编写test5.sh脚本#!/bin/bashecho零参数设置为:$0执行命令bashtest5.sh使用basename命令获取不包含的路径写入脚本test5b.sh的脚本名称#!/bin/bashname=$(basename$0)echoecho脚本名称为:$name使用该方法编写执行不同功能的脚本基于在脚本名称上写test6.shscript#!/bin/bashname=$(basename$0)if[$name="addem"]thentotal=$[$1+$2]elif[$name="multem"]thentotal=$[$1*$2]fiechoecho计算出的值为$total执行命令cptest6.shaddemcptest6.shmultem./addem25./multem2514.1.3测试参数脚本在使用参数之前,需要检查里面是否有数据写test7.sh脚本#!/bin/bashif[-n"$1"]然后回显你好$1,很高兴meetyou.elseecho“抱歉,您没有表明自己的身份。”fi执行命令./test7.shrich./test7.sh14.2特殊参数变量14.2.1参数统计特殊变量$#包含脚本运行时携带的命令行参数编写test8.sh脚本#!/bin/bashecho提供了$#个参数。执行命令./test8.sh./test8.sh12345./test8.sh"RichBlum"编写test9.sh脚本#!/bin/bashif[$#-ne2]thenechoecho用法:test9.shabechoelsetotal=$[$1+$2]echoecho总计为$totalechofiexecutecommand./test9.sh./test9.sh10./test9.sh1015获取最后一个命令行参数变量writetest10.shscript#!/bin/bashparams=$#echoecho总参数为$paramsecho最后一个参数为${!#}echo执行命令./test10.sh./test10.sh123./test10.sh123414.2.2抓取所有数据使用$*和$@变量访问所有参数使用for命令遍历这两个变量$*变量会都有参数被当成单个参数$@变量会分别处理每个参数编写test11.sh脚本#!/bin/bashechoecho"Usingthe\$*method:$*"echo"Usingthe\$@method:$@"echo执行命令./test11.shrichbarbarakatiejseeicawritetest12.shscript#!/bin/bashechocount=1forparamin"$*"doecho"\$*parameter#Scount=$param"count=$[$count+1]doneechocount=1forparamin"$@"doecho"\$@parameter#Scount=$param"count=$[$count+1]doneexecutecommand./test12.shrichbarbarakatiejseeica14.3shift变量shift命令将Shift命令行参数敲击根据它们的相对位置:使用shift命令时要小心如果删除了一个参数,它的值将被丢弃并且无法恢复编写test13.sh脚本#!/bin/bashechocount=1while[-n"$1"]doecho"Parameter#$count=$1"count=$[$count+1]shiftdoneexecutecommand./test13.shrichbarbarakatiejessicawritetest14.shscript#!/bin/bashechoecho"原参数:$*"shift2echo"这里是新的第一个参数:$1"执行命令./test14.sh1234514.4处理选项14.4.1查找选项1.处理简单选项在提取每个单独的参数时,使用case语句判断参数是否为选项编写test15.sh脚本#!/bin/bashechowhile[-n"$1"]docase"$1"in-a)echo"Foundthe-aoption";;-b)echo"找到-b选项";;-c)echo"找到-c选项";;*)echo"找到一个选项";;esacshiftdone执行命令./test15.sh-a-b-c-d2。参数和选项分开Linux用双破折号(--)区分选项和参数writetest16.shscript#!/bin/bashechowhile[-n"$1"]docase"$1"in-a)echo"Foundthe-aoption";;-b)echo"找到-b选项";;-c)echo"找到-c选项";;--)换班休息;;*)echo"$1不是一个选项";;esacshiftdone#count=1forparamin$@doecho"Parameter#count:$param"count=$[$count+1]doneexecutecommand./test16.sh-a-b-ctest1test2test3./test16.sh-a-b-c--测试1测试2测试33。处理带值的选项有些选项会带来额外的参数值,脚本必须能够正确检测并处理编写test17.sh脚本#!/bin/bashechowhile[-n"$1"]docase"$1"在-a)echo"找到-a选项";;-b)param="$2"echo"找到-b选项,参数值为$param"shift;;-c)echo"找到-c选项";;--)换班休息;;*)echo"$1不是一个选项";;esacshiftdone#count=1forparamin$@doecho"Parameter#$count:$param"count=$[$count+1]done执行命令./test17.sh-a-btest1-d./test17.sh-btest1-a-d14.4.2使用getopt命令getopt命令是处理命令选项的一个非常方便的工具,当涉及到参数和参数时。它识别命令行参数,使在脚本中解析它们时更容易。一、命令格式命令格式:getoptoptstringparameters命令说明:getopt命令可以接受一系列命令行选项和任何形式的参数敲击:getopt命令有一个更高级的版本叫getopts(注意这是复数形式).getopts命令将在本章后面介绍。因为这两个命令的拼写几乎一模一样,很容易混淆,所以要小心。命令演示:getoptab:cd-a-btest1-cdtest2test3演示结果:-a-btest1-c-d–test2test3演示说明:optstring定义了四个有效的选项字母:a、b、c和d。冒号(:)放在字母b之后,因为b选项需要一个参数值。当getopt命令运行时,它会检查提供的参数列表(-a-btest1-c-d-test2test3)并根据提供的optstring对其进行解析。请注意,它会自动将-cd选项拆分为两个单独的选项,并插入双破折号以分隔行中的额外参数。getopt说明如果指定的选项不在optstring中,getopt命令将生成错误消息。如果要忽略此错误消息,可以在命令中添加-q选项。getopt命令选项必须出现在optstring之前。getopt命令不擅长处理。参数值带空格和引号2.在脚本中使用getopt编写test18.sh脚本#!/bin/bash#set--$(getopt-qab:cd"$@")#echowhile[-n"$1"]docase"$1"in-a)echo"Foundthe-aoption";;-b)param="$2"echo"找到-b选项,参数值为$param"shift;;-c)echo"找到-c选项";;-d)echo"找到-d选项";;--)换班休息;;*)echo"$1不是一个选项";;esacshiftdone#count=1forparamin"$@"doecho"Parameter#$count:$param"count=$[$count+1]doneexecutecommand./test18.sh-ac./test18.sh-a-btest1-cdtest2test3test414.4.3使用更高级的getoptsgetopts命令(注意复数)内置于bashshell中。命令格式:getoptsoptstringvariable命令说明:optstring与getopt命令中的optstring相同。使用OPTARG环境变量获取选项的参数值,编写test19.sh脚本#!/bin/bashechowhilegetopts:ab:coptdocase"$opt"ina)echo"Foundthe-aoption";;b)echo"Foundthe-boption,withvalue$OPTARG";;c)echo"找到-c选项";;*)echo"Unknownoption:$opt";;esacdone执行命令./test19.sh-abtest1-c./test19.sh-b"test1test2"-a./test19.sh-abtest1./test19.sh-acde使用shift命令和OPTIND值移动参数写入test20.shscript#!/bin/bashechowhilegetopts:ab:cdoptdocase"$opt"ina)echo"Foundthe-aoption";;b)echo"Foundthe-boption,withvalue$OPTARG";;c)echo"找到-c选项";;d)echo"找到-d选项";;*)echo"Unknownoption:$opt";;esacdone#shift$[$OPTIND-1]#echocount=1forparamin"$@"doecho"Parameter$count:$param"count=$[$count+1]done执行命令./test20.sh-a-btest1-dtest2test3test414.5将选项Standardization创建shell脚本时,可以决定使用哪些字母以及如何使用它们但是一些字母选项在linux世界中已经有了某种标准的含义。常用的Linux命令选项选项:说明-a:显示所有对象-c:生成一个计数-d:指定一个目录-e:展开一个对象-f:指定读入数据的文件-h:显示该对象的帮助信息命令-i:忽略文本大小写-l:生成输出的长格式版本-n:使用非交互模式(批处理)-o:将所有输出直接重新打印到指定的输出文件-q:以安静模式运行-r:递归处理目录和文件-s:以安静模式运行-v:生成详细输出-x:排除对象-y:对所有问题回答是14.6获取用户输入14.6.1基本阅读阅读命令接受来自的输入标准输入(键盘)或其他文件描述符Writetest21.shscript#!/bin/bashecho-n"Enteryourname:"readnameecho"Hello$name,welcometomyprogram."编写test22.sh脚本#!/bin/bashread-p"Pleaseenteryourage:"agedays=$[$age*365]echo"Thatmakesyouover$daysdaysold!"Writetest23.shscript#!/bin/bashread-p"Enteryourname:"firstlastecho"Checkingdatafor$last,$first..."读取命令会将它接收到的任何数据放入一个特殊的环境变量中写入test24.sh脚本REPLY#!/bin/bashread-p"Enteryourname:"echoecho你好$REPLY,欢迎来到我的程序。14.6.2使用读命令超时时,可以使用-t选项指定读命令等待的秒数用于输入。当计数器到期时,读取命令返回一个非零的退出状态码Writetest25.sh#!/bin/bashifread-t5-p"Pleaseenteryourname:"namethenecho"Hello$name,welcometomyscript"elseechoecho"对不起,太慢了!fi使用read命令的-n选项来计算输入的字符数。当输入的字符达到预设的字符数时,会自动退出并将输入的数据赋值给变量写入test26.sh脚本#!/bin/bashread-n1-p"Doyouwanttocontinue[Y/N]?”answercase$answerinY|y)echoecho"很好,继续...";;N|n)echoecho"OK,goodbay"exit;;esacecho"Theistheendofthescript"14.6.3隐藏方法读取使用-s选项隐藏读取命令中的输出数据,避免写入test27.sh命令直接在显示器上显示#!/bin/bashread-s-p"Enteryourpassword:"passechoecho"Isyourpasswordreally$pass?"14.6.4Readfromthefile在Linux上使用read读取文件中存储的数据系统。每次调用read命令时,它都会从文件中读取一行数据。当文件中没有内容时,读取命令退出并返回非零退出状态码WritetesttextOneTwoThreeWritetest28.shscript#!/bin/bashcount=1cattest|whilereadlinedoecho"line$count:$line"count=$[$count+1]doneecho"Finishedprocessingthefile"14.7总结本章描述了从脚本用户处理中获取数据的3种不同方式。命令行参数允许用户在运行脚本时直接从命令行输入数据。该脚本通过位置参数检索命令行参数并将它们分配给变量
