Shell的作用 -- 命令解释器,“翻译官”
Bash的常用功能:
Tab键自动补齐
命令历史
命令别名
标准输入输出
重定向操作
管道操作
命令历史
保存用户曾经执行过的命令操作
存放位置:~/.bash_history 文件
查看历史命令
使用↑、↓按键逐条翻看,允许编辑并重复执行
执行:history
清除历史命令
执行:history -c
调用历史命令
!n:执行历史记录中的第n条命令
!str:执行历史记录中以“str”开头的命令
设置记录历史命令的条数
修改 HISTSIZE 参数(默认为1000条)
Bash的标准输入输出 :
交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
Bash的重定向操作
Bash的管道操作:
管道操作符号“|”
连接左右两个命令,将左侧的命令输出的结果,作为右侧命令的输入(处理对象)
格式:cmd1 | cmd2 [... | cmdn]
Shell变量的应用
Shell变量
为灵活管理Linux系统提供特定参数,有两层意思:
1.变量名:使用固定的名称,由系统预设或用户定义
2. 变量值:能够根据用户设置、系统环境变化而变化
Shell变量的种类
用户自定义变量:由用户自己定义、修改和使用
环境变量:由系统维护,用于设置用户的Shell工作环境,只有极少数的变量用户可以修改
预定义变量:Bash预定义的特殊变量,不能直接修改
位置变量:通过命令行给程序传递执行参数
变量的赋值与引用
定义新的变量
变量名要以英文字母或下划线开头,区分大小写
格式:变量名=变量值
查看变量的值
格式:echo $变量名
查看所有变量:set
清除变量
unset 变量名
从键盘输入内容为变量赋值
格式: read [-p "信息"] 变量名
结合不同的引号为变量赋值
双引号 “ ” :允许通过$符号引用其他变量值
单引号 ‘ ’ :禁止引用其他变量值,$视为普通字符
反撇号 ` ` :将命令执行的结果输出给变量
[root@localhost ~]# echo $FILESVR
filesvr.lamp.com
[root@localhost ~]# export FILESVR
[root@localhost ~]# zsh
[root@localhost]~# echo $FILESVR
filesvr.lamp.com
[root@localhost]~# exit
[root@localhost root]# unset FILESVR
[root@localhost root]# echo $FILESVR
数值变量的运算:
计算整数表达式的运算结果
格式:expr 变量1 运算符 变量2 ...[运算符 变量n]
expr的常用运算符
加法运算:+
减法运算: -
乘法运算: \*
除法运算: /
求模(取余)运算: %
环境变量赋值:
设置变量的作用范围
格式:export 变量名...
export 变量名=变量值 [...变量名n=变量值n]
查看环境变量
env 或 export
清除用户定义的变量
格式:unset 变量名
多命令运行:
;
命令顺序执行。
&&
前后命令的执行存在逻辑与关系,只有&&前面的命令执行成功后,它后面的命令才被执行。
||
前后命令的执行存在逻辑或关系,只有||前面的命令执行失败后,它后面的命令才被执行。
()
改变命令执行顺序
通配符与特殊符号:
通配符
* 任意多个
? 任意一个
[] 括号内任一个 [^0-9]非数字
特殊符号
\ 转义符
& 后台
! 非
Shell脚本的概念:
Shell脚本
1.用途:完成特定的、较复杂的系统管理任务
2.格式:集中保存多条Linux命令,普通文本文件
3.执行方式:按照预设的顺序依次解释执行
编写可执行的Shell脚本 :
建立包含执行语句的脚本文件
#脚本文件中包括的内容
运行环境设置:#!/bin/bash
注释信息:以#开始的说明性文字
可执行的Linux命令行
为脚本文件添加可执行权限
给shell脚本增加执行权限
[root@localhost ~]# vi repboot.sh
#!/bin/bash
# To show usage of /boot directory and mode of kernel file.
echo "Useage of /boot: "
du -sh /boot
echo "The mode of kernel file:"
ls -lh /boot/vmlinuz-*
[root@localhost ~]# chmod a+x repboot.sh
运行Shell脚本程序:
1.直接执行具有“x”权限的脚本文件
例如:./repboot.sh
2.使用指定的解释器程序执行脚本内容
例如:bash repboot.sh、sh repboot.sh
3.通过source命令(或 . )读取脚本内容执行
例如:souce repboot.sh 或 . hello.sh
正则表达式:
1 ^
#只匹配行首
2 $
#只匹配行尾
3 *
#匹配0个或者多个单字符
4 []
#只匹配[]内字符,可以是一个单字符,也可以是字符序列,可以使用*表示[]内字符序列范围,如用[1-5]代替[12345]
5 \
#只用来屏蔽一个元字符的特殊含义
6 .
#只匹配任意单字符
7 pattern\{n\}
#匹配n次pattern
8 pattern\{n,\}
#匹配n次以上pattern
9 pattern\{n,m\}
#匹配n到m次pattern
10 ...x..x..x
#匹配文件或目录权限的属性非常有用
11 ^只允许在一行的开始匹配字符或单词
^d 筛选出以d开头的文件属性
12 ^ $
#匹配空行
13 ^.$
#匹配包含一个字符的行
14 kkk$
#匹配以kkk结尾的所有字符
15 \*\.pas
#匹配以*.pas结尾的所有字符或文件
16 a\{2\}b
#a出现两次,aab
17 a\{4,\}b
#a至少出现4次,aaaab,aaaaab ..
18 a\{2,4\}
#a出现次数范围2-4次
19 [0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}
#匹配所有ip地址
awk命令使用:
1 last > file
#把last命令结果保存在file文件中
2 awk ‘{print $0 “\n”}' file
#查找出file文件中的每一列
3 awk '{print $1"\t"$7 “\n”}' file
#查找出file文件中的第1列和第七列
awk常见内置变量:
NF 每一行的字段数
NR 当前处理的尾第几行
FS 字段分隔符(默认为空格)
last | awk ‘{printf $1 “\t lines:” NR “\t columes:” NF ”\n”}’
BEGIN 预设变量。在awk程序没有读取数据前 执行,且只执行一次
cat /etc/passwd | awk ‘BEGIN {FS=“:”} {printf $1 “\t” $3 “\n”}’
条件测试操作:
test命令
用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值
格式:test 条件表达式 [ 条件表达式 ]
常见的测试类型
测试文件状态
字符串比较
整数值比较
逻辑测试
测试文件状态
格式:[ 操作符 文件或目录 ]
常用的测试操作符
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否可执行(Excute)该文件
-L:测试是否为符号连接(Link)文件
整数值比较
格式:[ 整数1 操作符 整数2 ]
常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)
字符串比较
格式:[ 字符串1 == 字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ]
常用的测试操作符
==:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
逻辑测试
格式:[ 表达式1 ] 操作符 [ 表达式2 ] ...
常用的测试操作符
-a或&&:逻辑与,“而且”的意思
#前后两个表达式都成立时整个测试结果才为真,否则为假
-o或||:逻辑或,“或者”的意思
#操作符两边至少一个为真时,结果为真,否则结果为假
!:逻辑否
#当指定的条件不成立时,返回结果为真
if条件语句:
应用示例:
如果/boot分区的空间使用超过80%,输出报警信息
#!/bin/bash
RATE=`df -hT | grep "/boot" | awk '{print $6}' | cut -d "%" -f1 `
if [ $RATE -gt 80 ]
then
echo "Warning,DISK is full!"
fi
判断mysqld是否在运行,若已运行则输出提示信息,否则重新启动mysqld服务:
#!/bin/bash
TEST=`/usr/bin/pgrep mysqld `
if [ “$TEST” != “” ]
then
echo "mysqld service is running."
else
/etc/init.d/mysqld restart
fi
依次输出3条文字信息,包括一天中的“Morning”、“Noon”、“Evening”字串:
[root@localhost ~]# vi showday.sh
#!/bin/bash
for TM in "Morning" "Noon" "Evening"
do
echo "The $TM of the day."
done
执行脚本:
[root@localhost ~]# sh showday.sh
The Morning of the day.
The Noon of the day.
The Evening of the day
批量添加20个系统用户帐号, 用户名依次为“stu1”、“stu2”、……、“stu20”
这些用户的初始密码均设置为“123456”
#!/bin/bash
i=1
while [ $i -le 20 ]
do
useradd stu$i
echo "123456" | passwd --stdin stu$i &> /dev/null
i=`expr $i + 1`
done
批量删除上例中添加的20个系统用户帐号:
#!/bin/bash
i=1
while [ $i -le 20 ]
do
userdel -r stu$i
i=`expr $i + 1`
done
编写脚本文件 mydb.sh,用于控制系统服务mysqld
当执行 ./mydb.sh start 时,启动mysqld服务
当执行 ./mydb.sh stop 时,关闭mysqld服务
如果输入其他脚本参数,则显示帮助信息
#!/bin/bash
case $1 in
start)
echo "Start MySQL service."
;;
stop)
echo "Stop MySQL service."
;;
*)
echo "Usage:$0 start|stop"
;;
esac