Shell脚本笔记

 
如何查询文件里的某个字符串?
grep “字符串” 文件
例:grep "abc" tmp.txt
 
如何将查询出来的内容赋给变量?
str=$(grep "abc" tmp.txt) 
 
如何打印变量的值?
echo $varname
注:要想引用变量,最好写成${varname}的形式
 
如何在屏幕上输出提示,让用户输入y或n来选择进行下一步?
echo -n "Continue?"
read ANS
case $ANS in
y|Y|yes|Yes)
    要执行的语句
    ;;
n|N|no|No)
    exit 0
    ;;
esac
注:read从标准输入中读取一行,并把输入行的每个字段的值指定给shell变量。
 
如何将命令在屏幕输出的同时也写入文件?
命令 | tee 文件
或:
your_script.sh 2>&1 | tee 文件
 
如何让光标在屏幕上显示在命令之后的位置而不是下一行?
echo -n “命令”是取消echo之后自带的换行符
 
如何启用控制字符?
echo -e “a b c d e f”
 
如何注释多行代码?
:<<COMMENT
    要注释的code
COMMENT
或在vim中,:50,70 s/^/#可注释从50行到70行的内容
 
如何不执行脚本,只检查语法?
sh -n your_script
 
如何调试?
sh -x your_script
会显示所有变量,并执行脚本
 
如何产生随机数?
a=RANDOM
echo $a
 
注意:
无论有多少缩进,EOT一定要顶格写。
等号两边不能有空格。
if [ xxx ]; then xxxx; fi 括号和内容之间必须有一个空格。
调用函数只是fun,没有括号与分号。
shell中的一切变量都是字符串类型。
变量多于一个单词的话,必须用双引号。
显示特殊字符,比如就想显示$a,可用单引号。
局部变量必须以local声明。全局变量没有什么修饰。
所有写入/dev/null的信息都消失了,不会保存在磁盘里。如果将标准输出和错误重定向到/dev/null,就能让终端闭嘴。
类似于/dev/null,/dev/zero也是个伪文件,会产生一个null流,是二进制的0流。
输出到/dev/tty的信息只会显示在当前工作的终端显示器上。
$#代表传入函数的参数个数,$@代表所有参数
0 表示标准输入,1 表示标准输出,2 表示错误输出
为了展示一段memu以供客户选择,可以使用select关键字
 
【截取字符串】

截取要求中的“最左”与“最右”
注意:pattern只能是从最左开始匹配,如果不包含第一个字符,那么就不能工作。
${variable#pattern} - 截去从最左开始匹配的最短符合pattern的子串
${variable##pattern} - 截去从最左开始匹配的最长符合pattern的子串

${variable%pattern} - 截去从最右开始匹配的最长符合pattern的子串
${variable%%pattern} - 截去从最右开始匹配的最长符合pattern的子串

例如:
variable="Now is the time"
echo ${variable} // 打印出 Now is the time
echo ${variable#N*i} // 打印出 s the time
echo ${variable##N*i} // 打印出 me
echo ${variable%time} // 打印出 Now is the
echo ${variable%%t*e} // 打印出 Now is

语法:${variable:offset:length}
例如:
var="hello"
var=${var:3:2}
echo $var //打印出 "lo"

 

【SHELL特殊的元字符】
*(pattern1|pattern2) 0次或者多次触发
例如,*([0-9]) 0个或者多个数字
?(pattern1|pattern2) 0次或者1次触发
例如,?([0-9]) 0个或者1个数字
+(pattern1|pattern2) 1次或者多次触发
@(pattern1|pattern2) 仅仅1次触发
!(pattern1|pattern2) 1次都不触发
例如,!(err*|fail*)表示,不能以“err”或者"fail"开头的词

【保留变量】

$IFS  这个变量中保存了用于分割输入参数的分割字符,默认识空格。
$HOME  这个变量中存储了当前用户的根目录路径。
$PATH  这个变量中存储了当前 Shell 的默认路径字符串。
$PS1  表示第一个系统提示符。
$PS2  表示的二个系统提示符。
$PWD  表示当前工作路径。
$EDITOR 表示系统的默认编辑器名称。
$BASH  表示当前 Shell 的路径字符串。
$0, $1, $2, ... 表示系统传给脚本程序或脚本程序传给函数的第0个、第一个、第二个等参数。
$#   表示脚本程序的命令参数个数或函数的参数个数。
$$   表示该脚本程序的进程号,常用于生成文件名唯一的临时文件。
$?   表示脚本程序或函数的返回状态值,正常为 0,否则为非零的错误号。
$*   表示所有的脚本参数或函数参数。
$@   和 $* 涵义相似,但是比 $* 更安全。
$!   表示最近一个在后台运行的进程的进程号。


 

【参考文献】

Shell脚本调试技术 http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/index.html

一个程序演示所有的shell编程知识 http://code.google.com/p/ldd6410/wiki/ShellScript

Linux Shell Scripting Tutorial A Beginner‘s handbook  http://www.freeos.com/guides/lsst/