摘自《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 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...
随机推荐
- poj1236 Tarjan算法模板 详解
思想: 做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间最早的节点的开始时间.初始时dfn ...
- 防止csrf
//防csrf攻击 $csrf_hash = md5(uniqid(rand(), TRUE)); set_cookie("my_csrf_name", $csrf_hash, 0 ...
- BZOJ1227 [SDOI2009]虔诚的墓主人 【树状数组】
题目 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地.为 ...
- Eclipse或MyEclipse没有在java类文件上显示Spring图标的问题
Eclipse或MyEclipse没有在java类文件上显示接口图标的问题解决办法: 前: 后:
- 关闭chrome浏览器的input香蕉黄背景
chrome浏览器input的自动完成,点击之后自动输入,input的背景会变成香蕉黄,用如下方法修复: /* Change the white to any color ;) 就是给input设置内 ...
- oracle distinct 用法
oracle distinct 是所有字段都相同才显示一条,要做到根据某一列,则如下 select t1.* from table t1 where t1.rowid = (select min(t2 ...
- xsy 1845 - GCD
from NOIP2016模拟题34 Description 给定一个长度\(n\le 10^6\)的序列, 给定\(A, B\) 给出一个序列,要求你通过如下两个操作使得序列中所有数的最大公约数大于 ...
- 使用redis-stat来监控redis实例
https://blog.csdn.net/xiao_jun_0820/article/details/78189576 https://blog.csdn.net/u010022051/articl ...
- AC日记——[CQOI2014]危桥 洛谷 P3163
题目描述 Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多只能通行两次.A ...
- Java 异常处理的优劣
Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理.不过,我认为很多人其实没有真正掌握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道概念.我想对 ...