摘自《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 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...
随机推荐
- DS博客作业-05--树
1.本周学习总结 1.1思维导图 1.2学习体会 1.课堂上的知识也很难听懂,打代码就更难听懂了,真的需要不断练习代码. 2.在学习本章的内容中,一开始只是理解了概念,在真正做题中,一点思路都没有 ...
- oracle中xhost报错
一.命令找不到 xhost:command not found yum whatprovides "*/xhost" Loaded plugins: product-id, sec ...
- NOIP2012开车旅行 【倍增】
题目 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为Hi,城市 i 和城 ...
- babel吐槽
1. .babelrc文件无法复制 每次复制项目文件,.babelrc文件都会丢失,导致项目的ES6莫名的编译失败,最可能出现的错误就是Unexpected token import错误,import ...
- 深入浅出mysql全文随笔
进入mysql :mysql -uroot -p 1.DDL(Data Definition Languages)语句:数据定义语言 2.DML(Data Manipulation Language) ...
- poj 3532 Resistance
---恢复内容开始--- Resistance Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 1289 Accepte ...
- 【HDOJ6217】BBP Formula(公式)
题意:给定一个无穷项的分式,它的和等于π,问π的十六进制表示的小数点后第n位是多少 1 ≤ n ≤ 100000 思路:From https://blog.csdn.net/meopass/artic ...
- hdu 3478 Catch 二分图染色
题目链接 题意 小偷逃跑,从某个点出发,每下一个时刻能够跑到与当前点相邻的点. 问是否存在某一个时刻,小偷可能在图中的任意一个点出现. 思路 结论 如果该图为连通图且不为二分图,则可能,否则不可能. ...
- 两个VLC实现播放串流测试 (转)
实现原理: 一个VLC打开视频文件发布串流(格式HTTP.RTP.RTSP等),另一个VLC打开串流播放 发布串流步骤: 1.菜单“媒体”->“流”,先添加视频文件.选择“串流”,如下图: 2. ...
- Yii CActiveForm 客户端验证(enableClientValidation)和自定义验证
使用Yii的CActiveForm默认使用服务器端模型(model)的rules规则验证数据. 但这会导致无谓的请求提交,比较好的方式是为了用户体验在客户端也验证,而为了安全性,在服务器端和数据库也做 ...