Shell脚本是一个包含一系列命令序列的文本文件。当运行这个脚本文件时,文件中包含的命令序列将得到执行
第一本部分:常见shell命令
echo "some text" #将文字内容打印到屏幕
ls #文本列表
wc -l file #计算文件中的行数
wc -w file #计算文件中的单词数
wc -c file #计算文件中的字符数
grep 'string' file #在文件中搜索字符串 eg grep 'searchstring' file.txt
cat file.txt #输出文件内容到标准输出设备(屏幕)上
file somefile #得到文件的类型
read var #提示用户输入,并将输入赋值给变量
sort file.txt #对文件中的行进行排序
uniq #删除文件中的行列 eg sort file.txt | uniq
expr #进行数字运算 eg expr 2 "+" 3
find #搜索文件。eg 根据文件名进行搜索 find . - name filename -print
tee #将数据输出到标准输出设备(屏幕)和文件。 eg somecommand | tee outfile
basename file #返回不包含路径的文件名 eg basename /bin/tux 将返回tux
dirname file #返回文件所在路径 eg dirname /bin/tux 将返回/bin
head file #打印文本文件开头几行
tail file #打印文本文件末尾几行
sed #sed 是一个基本的查找替换程序,可以从标准输入(如命令管道)读入文本,并将结果输出到标准输出(屏幕),不要和shell中的通配符相混淆
awk #awk 用来从文本文件中提取字段。默认,字段分隔符是空格,也可以使用-F 指定其他分隔符。
第二部分:特殊字符
# 注释,注意:在同一行中,命令不会跟在一个注释的后面
; 命令分隔符(分号),分隔符允许在同一行里有两个或更多的命令。
;; case语句分支的结束符(双分号)
. (圆点),点命令,它可以作为一个文件名的组成部分。
"
(中间有省略的)
: 空命令(冒号)。该命令的含义是空操作
! 取反一个测试结果或退出状态(感叹号)
$ 变量替换(引用一个变量的内容)。
() 命令组 。一组由圆括号括起来的命令是新开一个子shell来执行的。由于是在子shell里执行,在圆括号里的变量不能被脚本里的其他部分访问,因为父进程(即脚本进 程)不能存取子进程才创建的变量
{ } 代码块 。该结构也是一组命令代码块,属于匿名的函数。与一个函数有所不同的是,在代码块里的变量仍然能被脚本后面的代码访问。由于花括号括起来的代码块可以引用输入和输出哦i/O重定向。
> ,&> ,>&,>> 重定向
eg file>file2 重定向file1的输出到文件file2中去,如果文件file2存在则将会被覆盖
eg fcommand &>file2 重定向命令command的标准输出和标准错误到文件file2中、
command >&2 把命令command 的标准输出重定向到标注错误。
file1 >>file2 appends 将脚本file1的输出追加到文件file2,如果file2不存在,则将被创建
第三部分:变量和参数
1、变量替换 :引用它的值称为变量替换
2、变量赋值:用“=”对变量进行赋值。需要注意的是,“=”的左右两侧不能由空格符
3、bash 变量无类型
不同于许多其他编程语言,bash不以“类型”来区分变量。从本质上来说,bash变量是字符串,但是根据环境的不同,bash允许变量有整数计算和比较,其中的决定因素是变量的值是不是只含有数字。
eg #!/bin/sh #符号#!用来指定该脚本文件的解析程序
a="hello world"
ehco "a is : "
ehco $a #输出的是 a is : \n hello world
eg num=2
echo "this is a the $numnd" #只会输出this is a the 分析:因为shell会去搜索变量numnd的值,找不到会输出为空
改正:num=2
echo "this is a the ${num}nd"
4、局部变量
局部变量只是在代码块或一个函数中有效。如果变量用local来声明,那么它只能在该变量声明的代码块中可见。这个代码块就是局部“范围”、在一个函数内,局部变量意味着只能在函数代码块内才有意义
eg #!/bin/bash
hello="var1"
echo $hello
function func1
{
local hello="var2"
echo $hello
}
func1
echo $hello #输出var1 var2 var1
5、环境变量
这种变量会影响shell的行为和用户接口。在大多数情况下,每个进程都会有一个“环境表”,它是由一组进程使用的环境变量组成。与其他的进程一样,每当一个shell启动时,它都会创建新的何时的环境变量。如果它增加或是更新一个环境变量,都会使这个shell的环境表得到更新,换句话说,更改或增加的变量会立即生效,。并且这个shell所有的子进程(即它执行的命令)都能继承其环境变量。准确的说,应该是后继生成的子进程才会继承shell的新的环境变量,已经运行的子进程并不会得到其新的环境变量。分配给环境变量的总空间是有限的,如果创建太多的环境变量或有些环境变量的值太长而占用太多空间便会出错。
6、位置参数
$# :传入脚本的命令行参数个数
$* :所有命令行参数值,在各个参数值之间留有空格 或$@
v$0 :命令本身(shell文件名)
v$1 :第一个命令行参数
v$2 :第二个命令行参数
以此类推,在位置参数$9之后的参数就要用括号括起来.eg ${10},${11} 。。。。。。
第四部分:流程控制
一:条件控制
1、比较操作符
(1):常用整数比较操作符
-eq -ne -gt -ge -lt -le
> >= < <=
if [ "$a" -eq "$b" ] if [ "$a" -ne "$b" ] if [ "$a" -gt "$b" ] if [ "$a" -ge "$b" ] if [ "$a" lt "$b" ] if [ "$a" -le "$b" ]
if [ "$a" > "$b" ] if [ "$a" >= "$b" ] if [ "$a" < "$b" ] if [ "$a"<= "$b" ]
(2):常用字符串比较操作
= == (两者是同义词)
!= < >
-z 字符串为null,字符串长度为0
-n 字符串不为null,即长度不为0
(3)常用文件测试操作
-e 文件存在
- f 文件是个普通文件(不是一个目录或是一个设备文件)
-s 文件大小不为空
-d 文件是一个目录
-b 文件是一个块设备(如软盘,光驱)
-c 文件时一个字符设备(如键盘,调制调节器,声卡)
-p 文件是一个管道
-h 文件是一个符号链接
-L 文件是一个符号链接
-S 文件是一个socket
-t 文件(描述符)与一个终端设备有关
-r 文件是否可读(指运行这个测试命令的用户的权限,下面同此)
-w 文件是否可写
-x 文件是否可执行
-g
-u
(3)嵌套的if/then语句
if [ condition1 ]
then
if [ condtion2 ]
then
do-somothing #仅当condtion1和condtion2同时满足才能执行do-something
fi
fi