1. 什么是shell脚本
shell脚本就是以shell为解释器的一种脚本程序,至于脚本的概念和用处请参见我的另一篇博客:脚本语言和编程语言的比较,它可以和系统进行交互,可以这么说,是一种交互式编程语言。
2. 脚本的执行方式
2.1.echo输出命令
echo [选项] [输出内容]
选项:
-e:支持反斜线控制的字符转换
echo -e "\e[1;31m 嫁人就要嫁凤姐\e[0m"
#\e[:使用颜色 1 :是开启颜色 \e[0m :颜色结束
# 30m=黑色 31m=红色 32m=绿色 33m=黄色
#34m=蓝色 35m=洋红 36m=青色 37m=白色
2.2. 在一个文件中编写脚本执行。
1)编辑脚本
vihello.sh
2)脚本 的内容为:
#!/bin/bash------不能省这个说明这个当前脚本程序使用哪一个shell解释器
内容
3)赋予执行权限
chmod755 hello.sh
4)运行
./hello.sh #注意执行脚本的方式是通过路径(绝对路径或者相对路径)执行的,如果想要直接运行,可以将这个脚本写到或者链接到PATH变量指定的目录,比如、bin
5)通过Bash调用脚本执行
bashhello.sh
6.)将Windows中编辑的脚本转化为Linux中的
将Windows中编辑的脚本转化为Linux中用的
dos2unix 文件名
将Linux中编辑的脚本转化为Windows中用的
unix2dos 文件名
2.3. 起别名
1)alias #查看系统中所有的命令别名 (推荐大家使用vim不适用vi)
alias 别名= '原命令'-------注意这种方式是重启之后就失去作用的
#设定原命令 例如 alias vi='vim'
可以设置缺省的命令,比如ll命令,就是ls -l alias ll='ls -l’
2) 别名永久生效与删除别名
vi ~/.bashrc就是/root/.bashrc
vi ~/.bashrc-------对root生效 如果是home/user1/.bashrc
#写入环境变量配置文件
unalias 别名
#删除别名
3. 命令生效顺序
第一顺序位执行用绝对路径或相对路径执行的命令
第二顺序位执行别名
第三顺序位执行Bash的内部命令
第四顺序位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
4. 常用快捷键
ctrl + c 强制终止当前命令
ctrl + l 清屏
ctrl + a 光标移动到命令首行
ctrl + e 光标移动到命令行尾
Ctrl + u 从光标所在的位置删除到行首,也是剪切
ctrl + z 把命令放入后台
ctrl + y 把 Ctrl + u剪切的命令,复制到本命令行
ctrl + r 在历史命令中搜索
ctrl+ d 退出当前终端
ctrl + backspace 在交互模式下的删除
5. 历史命令
history [选项] [命令历史保存文件]
选项:
-c:清空历史命令(一般不用清空)
-w:把缓存中的历史命令写入历史命令保存文件~/.bash_history
历史命令会默认保存一千个历史命令,可以在配置文件/etc/profile中进行修改
历史命令的调用:
使用上下箭头调用以前的历史命令
使用!n重复,执行第n条历史命令
使用!!重复上一条命令
使用"!字串"重复执行最后一条以该字符串开头的命令
6. 输入输出重定向
输入重定向:就是本来应该由键盘输入的内容,现在放入一个文件中,从里面读出来,叫做输入重定向。比如,为了免去用户输入的麻烦,用输入重定向给用户安装程序
输出重定向:就是本来应该在屏幕上面显示的错误或者正确的信息,现在输出到一个文件中,进行保存,这就是输出重定向。比如:将现在的数据输出到一个文件中,等待有时间的时候再看。
标准的输入输出设备:
键盘 /dev/stdin 标准输入 文件描述符:0
显示器 /dev/stdout 标准输出 文件描述符:1
显示器 /dev/stderr 标准错误输出 文件描述符:2
1) 输出重定向:
命令 > 文件 #覆盖,一个大于号是重写这个文件,会覆盖
命令 >> 文件 #追加,有输出的命令才可以保存到文件中,两个大于号是在下面追加
命令 >> 文件1 2>> 文件2-------将正确的命令保存在文件1,错误的文件保存在文件2,注意:红颜色的2,是文件描述符是标准的错误输出,
ifconfig &>> test.log-------将错误和正确的命令都写入文件
/dev/null是垃圾桶,当我们写的脚本不需要输出,但是命令本省就有输出的话,可以将这个命令输出的内容
放入/dev/null,命令如下,命令 &>> /dev/null 这样就可以了,
例子:ifconfig >test.log------单大于号是覆盖
ifconfig >> test.log----双大于号是追加
ifconfigfasfsd 2>>test.log-------重定向错误的命令,输出错误文件必须加上2,紧挨着>>才行,不能有空格
ifconfig&>> test.log-------将错误和正确的命令都写入文件
2) 输入重定向
命令 << 文件
例子:
wc [选项] [文件名] #将需要用键盘输入的内容放入文件,然后执行,就是把文件作为输入的内容,输入重定向一般不用,除非打补丁的时候用,wc会统计输入的字符个数什么的
选项:
-c 统计字节数
-w 统计单词数
-l 统计行数
wc -c << 文件名
wc -w << 文件名
wc -wl << 文件名
read str < 文件名
7. 多命令
;----顺序执行命令(分号),可以在前后加上时间,统计命令执行时间
&& ---------如果命令1,正确执行了,命令2,才能正确执行,也就是说在Linux中,只判断一头,不是两个都判断
|| ------如果命令1,正确执行了,那么命令2就不会执行
命令&& echo yes || echo no -------用来判断是否命令执行正确。
比如:./configure && make && make install 只有前一条正确执行,后一条才能正确执行
8. 管道符:
命令1|命令2
#命令1的正确输出作为命令2的操作对象
比如:ls - l /etc | more
相当于 ls -l /etc >log.txt
more log.txt
netstat -an ------查看本地程序
netstat -an | grep ESTABLISTHED -----可以知道有多少用户登录
--color=auto搜索出的关键字用颜色显示
netstat -an | grep --color=autoESTABLISTHED ---“把搜索出的ESTABLISTHED用颜色显示”
9. 通配符:
通配符 作用
? 匹配一个任意字符
* 匹配0个或者任意多个字符
[] 匹配括号中的任意一个字符。
[-] 匹配括号中的任意一个字符,-是范围,比如[a-z]
[^] 逻辑非
rm -rf * 删除所有当前目录下的文件
10. shell脚本变量
10.1. 变量的分类:
1.用户自定义变量
2.环境变量:这种变量中主要保存的是和系统操作环境相关的数据
3.位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义变量的作用是固定的。
4.预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量的作用也是固定的。位置参数是预定义变量的一种。
10.2.变量的声明、查询和删除
linux中所有变量默认是字符串
1.用户自定义变量:在当前脚本中都有效,没有局部变量之说
变量=变量值
set
#查询用户自定义变量
unset 变量名
#删除变量
2.环境变量:整个用户的shell,或者系统中所有shell都能使用的变量
export变量名=变量值
#声明为环境变量
env
#查询环境变量
unset 变量名
#删除变量
3. 位置参数变量
$n n位数字,$0,代表命令本身,$1-9代表第1到第9个参数,十个以上需要用大括号括起来如${10}
$* 这个变量代表命令行中所有的参数,$*把整个命令看成一个整体
$@ 这个变量也是代表命令行中所有的参数,不过$@把每个参数区别对待
$# 这个变量代表命令行中所有参数的个数。
4.预定义变量:
$? 最后一次执行的命令的返回状态,如果这个命令变量的值为0,证明上一个
命令正确执行,如果这个变量的值非0(具体是哪个数,由命令自己来决定),
则证明上一个命令执行不正确
$$ 当前进程的进程号(pid)
$! 后台运行的最后一个进程号(pid)
5.退出:
exit
#exit退出,也可以退出当前shell,进入父shell,定义环境变量的目录。然后系统就可以进入这个目录,查找相应的命令,找不到就会报错
11. 数值计算:
11.1.declare
由于shell脚本中默认都是字符串,所以在这里用declare声明为数字
declare[+/-] [选项] 变量名
选项:
-: 给变量设定类型属性
+: 取消变量的类型属性
-i 将变量声明为整数型(integer)
-x 将变量声明为环境变量(export)
-p: 显示指定变量的被声明的类型
比如:
a=22
b=33
declare -i c=$a+$b
就会输出计算结果了
11.2. 使用expr或let数值运算工具
aa=11
bb=22
#给aa和bb变量赋值
dd=$(expr$aa + $bb) #小括号和反双引号的作用是一样的
或者dd=`(expr$aa + $bb `
或者:let “aa++” #这个就是给aa+1的意思
#小括号的作用是将运算的结果,赋值给dd,但是注意:+ 左右两侧必须有空格
11.3. .使用$((运算式))或者使用$[运算式] #推荐
aa=11
bb=22
ff=$(($aa+$bb))#最常用
gg=$[$aa+$bb]
计算的时候有运算符
Linux中的运算符,和Java中的完全一致,比如特殊的:=,+=,-=,*=,/=%=,&=,`=,|=,<<=,>>=
ff=$(( 运算式 )) 运算式中可以有加减乘除,也可以有小括号,也就是说数学中怎么算,这里就可以怎么算,变量之间也不用用空格了
12. 环境变量配置文件
12.1.环境变量配置文件的简介
这些配置文件的作用就是,使环境变量每次开机都会生效,如果不写在这里,每次系统启动的时候就会环境变量就会失效。
12.2. source命令
source 配置文件
或 . 配置文件
#让环境变量的配置文件生效,不用退出,.在配置文件中使用是调用某个配置文件
12.3. 环境变量配置文件中主要的几个环境变量:
环境变量配置文件中主要定义对系统的操作环境生效的系统默认环境变量
,比如PATH,HISTSIZE、PSI、HOSTNAME等默认环境变量
12.4 5类环境变量配置文件
/etc/profile #对所有用户都会生效
/etc/bashrc #对所有用户都会生效
/etc/profile.d/*.sh #*代表一组文件,很多个.sh文件
~/.bash_profile #对当前用户生效
~/.bashrc #对当前用户生效,去家目录里面修改
12.5环境变量配置文件的调用顺序。
13. 正则表达式
13.1正则表达式和通配符的区别
正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配
。grep awk sed 等命令可以支持正则表达式
通配符用来匹配符合条件的文件名,,通配符是完全匹配
。ls find cp 这些命令不能支持正则表达式,所以只能适用shell自己的通配符来进行匹配了