摘自《Linux与unix shell编程指南》
shift运行后,$#随之减少;
如果需要知道命令行中输入的最后一个参数(通常是一个文件名),可以有两种选择:使用命令 eval echo \$$#;使用shift命令:shift 'expr $# - 2'。
getopts 选项字符串 名称 [参数表]
每次使用时,getopts 都会把下一个选项放在shell变量名称中(如果名称不存在就初始化它),并把下一个要处理的参数的下标放在变量 OPTIND 中。如果某个选项需要参数,getopts 就把该参数放在变量 OPTARG 中。Shell不会自动把 OPTIND 重置;如果在同一个shell中多次调用 getopts 时要使用新的参数,则必须手动重置它。处理完选项结尾时,getopts 会退出并返回一个大于零的状态;OPTIND 会指向第一个非选项参数的下标;而名称被设为“?”.getopts 可以通过两种方式报错。如果选项字符串的第一个字符是冒号,则忽略报错;正常情况下,如果遇到无效选项,或者忽略了选项的参数,就会打印诊断信息。如果遇到了无效的选项,getopts 就会在名称里面放入"?"。这时如果不忽略报错,就打印一条错误信息并重置 OPTARG;如果忽略报错,就把该选项放在 OPTARG 中而不打印错误信息。如果某个必要参数没有找到,并且 getopts 没有忽略报错,则在名称中放入问号"?" 并重置 OPTARG且打印错误信息。如果getopts 忽略错误,则在名称中放入冒号":",并把 OPTARG 设为找到的选项字符。
getopts一般格式为:
getopts option_string variable
在上述例子中使用脚本:
while getopts ahfgv OPTION
getopts查看所有以连字符开头的参数,将其视为选项,如果输入选项,将把这与option_string对比,如果匹配发现,变量设置为OPTION,如果未发现匹配字符,变量能够设置为?。重复此处理过程直到选项输入完毕。
错误信息提示并不明确,因此可以用自己的反馈信息屏蔽它,方法如下:
将冒号放在 option_string开始部分。
while getopts :ahfgvc: OPTION
在case语句里使用?创建一可用语句捕获错误。
shift `expr $OPTIND - 1`
if [ $# = 0]
then
.....
: [参数]
除了扩展参数和执行重定向外不做任何操作。返回状态是零。
: ${ANS:=$DEFAULT}
HOLD=HOLD.$$
grep -v $CODE $DBFILE >$HOLD
vi中,在命令模式下 :set nu显示行号。
set -n 读命令但并不执行。
set -v 显示读取的所有行。
set -x 显示所有命令及其参数。
将set选项关闭,只需用 +替代-。有人总认为+应该为开,而-应为关闭,但实际刚好相反。可以在脚本开始时将 s e t选项打开,然后在结束时关闭它。或在认为有问题的特殊语句段
前后打开及关闭它。
set可以用来改变shell选项或者设置位置参数,也可以显示shell变量的名称和值。
-n 读取命令但不执行。这可以用来检查脚本的语法。在交互式的shell中,这个选项会被忽略掉。助记词: No-execution, 不执行
-v 在shell读取输入行时把它打印出来。助记词:Verbose, 详细
-x 对于简单命令,for 命令,case 命令,select 命令,命令与其参数或者关联的单词列表里面的算术运算,则在扩展以后、执行之前,打印跟踪信息。在打印命令及其扩展过的参数之前,先打印扩展后的 PS4 变量。助记词: X, 跟踪
/usr/local/sybin/syb_backup >>$log_f 2>&1 <<MAYDAY
2
3
Y
MAYDAY
<<MAYDAY之后的内容就是手工运行syb_backup脚本所需要输入的内容,直到遇到另外一个MAYDAY结束。
最常用的信号及它们的含义。
信号 信号名 含义
1 SIGHUP 挂起或父进程被杀死
2 SIGINT 来自键盘的中断信号,通常是 <CTRL-C>
3 SIGQUIT 从键盘退出
9 SIGKILL 无条件终止
11 SIGSEGV 段(内存)冲突
15 SIGTERM 软件终止(缺省杀进程信号)
还有信号0,我们前面在创建.logout文件时已经遇到过。该信号为“退出shell”信号。为了发出信号0,只要从命令行键入exit,或在一个进程或命令行中使用<CTRL-D>即可。
trap [-lp] [参数] [信号指示]
当shell接收到信号指示中的信号时,就会读取和执行参数中指定的命令。如果省略了参数(这时只有一个信号指示)或者参数是"-",则每个指定信号的处理都重置为shell启动时的值。如果参数是空字符串,则shell及它所启动的命令会忽略每个信号指示指定的信号。
trap可以使你在脚本中捕捉信号。该命令的一般形式为:
trap name signal(s)
其中,name是捕捉到信号以后所采取的一系列操作。实际生活中,name一般是一个专门用来处理所捕捉信号的函数。Name需要用双引号( ”“ )引起来。 Signal就是待捕捉的信号。也可以使用单引号来代替双引号;其结果是一样的。
可以使用logger命令向/var/log/syslog发送消息:
bai@bbox:~$ ll /var/log/syslog
-rw-r----- 1 syslog adm 730 1月 29 23:17 /var/log/syslog
bai@bbox:~$ logger "sdfsfsf"
bai@bbox:~$ ll /var/log/syslog
-rw-r----- 1 syslog adm 764 1月 29 23:50 /var/log/syslog
bai@bbox:~$ tail -10 /var/log/syslog
Jan 29 19:07:05 bbox rsyslogd: [origin software="rsyslogd" swVersion="5.8.6" x-pid="619" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Jan 29 19:08:54 bbox anacron[1108]: Job `cron.daily' terminated
Jan 29 19:08:54 bbox anacron[1108]: Normal exit (1 job run)
Jan 29 19:17:01 bbox CRON[2898]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jan 29 20:17:01 bbox CRON[3166]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jan 29 21:17:01 bbox CRON[3384]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jan 29 22:17:01 bbox CRON[3534]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jan 29 23:17:01 bbox CRON[3786]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Jan 29 23:50:27 bbox bai: sdfsfsf
bai@bbox:~$
#save tty settings and hide characters typed in
SAVEDTTY=`stty -g`
stty -echo
....
stty $SAVEDTTY
-----待续
摘自《Linux与unix shell编程指南》的更多相关文章
- Linux与Unix shell编程指南(完整高清版).pdf
找到一本很详细的Linux Shell脚本教程,其实里面不光讲了Shell脚本编程,还介绍了系统的各种命令 http://vdisk.weibo.com/s/yVBlEojGMQMpv 本书共分五部分 ...
- Linux 与 unix shell编程指南——学习笔记
第一章 文件安全与权限 文件访问方式:读,写,执行. 针对用户:文件属主,同组用户,其它用户. 文件权限位最前面的字符代表文件类型,常用的如 d 目录:l 符号链 ...
- Linux与unix shell编程指南
第14章 环境和shell变量 1.使用变量时,尽量用花括号将之括起来,防止shell误解变量值. 2.设置变量时的不同模式 variable-name=value 设置实际值到variable-na ...
- Linux Unix shell 编程指南学习笔记(第五部分)
第二十五章 深入讨论 << 当shell 看到 << 的时候,它知道下一个词是一个分界符.该分界符后面的内容都被当做输入,直到shell又看到该分界符(位于单独的一行).比方: ...
- Linux Unix shell 编程指南学习笔记(第四部分)
第十六章 shell脚本介绍 此章节内容较为简单,跳过. 第十七章 条件測试 test命令 expr命令 test 格式 test condition 或者 [ conditio ...
- Linux Unix shell 编程指南学习笔记(第三部分)
第十三章 登陆环境 登陆系统时.输入username和password后.假设验证通过.则进入登录环境. 登录过程 文件/etc/passwd $HOME.profile 定制$HOME.profi ...
- Linux Unix shell 编程指南学习笔记(第二部分)
第七章 正則表達式介绍 匹配行首与行尾 匹配数据集 职匹配字母和数字 句点 "." 匹配随意单字符. ^,在行首 匹配字符串或字符序列,如查询当前文件夹下的全部文件夹: ls - ...
- Linux学习之Shell编程基础
转自:http://my.oschina.net/itblog/blog/204410 1 语法基本介绍1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来 ...
- linux下的Shell编程(3)shell里的流程控制
if 语句 if 表达式如果条件命令组为真,则执行 then 后的部分.标准形式: if 判断命令,可以有很多个,真假取最后的返回值 then 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...
随机推荐
- 九度oj 题目1397:查找数段
题目描述: 在BaiDu搜索引擎里,如何提高搜索效率是研发人员为之奋斗的目标.现在,JOBDU密码库里也有一段数字片段S(0<长度<=100,000),HQ想通过智能搜索得到包含关键字P( ...
- 九度oj 题目1363:欢乐斗地主
题目描述: 如果大家玩过欢乐斗地主这个游戏,就一定知道有一个具有“提示”功能的按钮.如果你不知道你现在手里的牌有没有比上家大的牌,并且你也懒得去一张一张地看你手中的牌.这时候你就可以点“提示”按钮,系 ...
- mysql处理添加外键时 error 150 问题
当你试图在mysql中创建一个外键的时候,这个出错会经常发生,这是非常令人沮丧的.像这种不能创建一个.frm 文件的报错好像暗示着操作系统的文件的权限错误或者其它原因,但实际上,这些都不是的,事实上, ...
- 【Luogu】P3232游走(高斯消元解概率)
题目链接 参见远航之曲dalao的题解,我再写一遍的话就没啥意思了. #include<cstdio> #include<cstring> #include<algori ...
- 刷题总结——寻宝游戏(bzoj3991 dfs序)
题目: Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄 ...
- Java如何获取ISO 8601时间
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); df.setTimeZone(TimeZ ...
- bzoj 3533 [Sdoi2014]向量集 线段树+凸包+三分(+动态开数组) 好题
题目大意 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); "Q x y l r (|x|,|y| & ...
- bzoj 1069 凸包+旋转卡壳
题目大意 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成 的多边形面积最大. 分析 枚举对角线的一个端点 另一个端点开始转 转的时候求出对角线左边面积 ...
- codeforces 449D DP+容斥
Jzzhu and Numbers Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u ...
- FOJ Problem 2253 Salty Fish
...