第一节 Shell概述
1.Shell是什么
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序,用户可以用Shell来启动,挂起,停止甚至编写一些程序。
即:硬件<->内核<->Shell<->外层应用程序
Shell还是一个功能强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令
2.Shell的分类
Bourne Shell:从1979年Unix就开始使用Bourne Shell,Bourne Shell主文件名为sh。
C Shell:C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名。
Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh,ksh,Bash,psh,zsh;C家族主要包括csh,tcsh
Bash:Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。
3.Linux支持的Shell
vi /etc/shells 查看Linux中支持的Shell
第二节 脚本执行方式
1.echo 输出命令
echo [选项] [输出内容]
选项
-e 支持反斜线控制的字符转换
\\ 输出\本身
\a 输出警告音
\b 退格键,也就是向左删除键
\c 取消输出行末的换行符,和"-n"选项一致
\e ESCAPE键
\f 换页符
\n 换行符
\r 回车键
\t 制表符
\v 垂直制表符
\0nnn 按照八进制ASCII码表输出字符,其中0为数字零,nnn是三位八进制数
\xhh 按照十六进制ASCII码表输出字符,其中hh是两位十六进制数
实例命令
echo -e "ab\bc" 删除左侧字符
echo -e "a\tb\tc\nd\te\tf" 制表符与换行符
echo -e "\x61\t\x62\t\x63\t\x64\t\x65\t\x66" 按照十六进制ASCII码输出字符
echo -e "\e[1;31m abcd\e[0m" 输出颜色
30m = 黑色 31m = 红色 32m = 绿色 33m = 黄色
34m = 蓝色 35m = 洋红 36m = 青色 37m = 白色
2.vi hello.sh
#!/bin/bash
#The first program
#Author:Shen Chao (Email:[email protected])
echo -e "Mr. Shen Chao is the most honest man in LampBrother"
3.脚本执行
1)赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh
2)通过bash调用执行脚本
bash hello.sh
注意:Windows下的换行符为^M$,而Linux下的换行符为$,所以在Windows下写的脚本在Linux下执行可能会发生问题,可以使用dos2unix命令进行转换。
第三节 Bash的基本功能
1.历史命令
history [选项] [历史命令保存文件]
选项
-c 清空历史命令
-w 把缓存中的历史命令写入历史命令保存文件 ~/.bash_history
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
历史命令的调用
使用上下箭头调用以前的历史命令
使用"!n"重复执行第n条历史命令
使用"!!"重复执行上一条命令
使用"!字符串"重复执行最后一条以该字串开头的命令
2.命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按"Tab"键就会自动进行补全
3.命令别名
alias 别名='原命令' 设定命令别名
alias 查看命令别名
unalias 别名 删除命令别名
命令执行的顺序
1)第一顺位执行用绝对路径或相对路径执行的命令
2)第二顺位执行别名
3)第三顺位执行Bash的内部命令
4)第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
注意:由于别名的优先级高于$PATH变量中的外部命令,所以尽量不要起与$PATH变量中相同的命令别名,这样原命令将无法生效
4.让别名永久生效
vi /root/.bashrc
5.Bash常用快捷键
ctrl+A 把光标移动到命令行开头,如果我们输入的命令过长,想要把光标移到命令行开头时使用
ctrl+E 把光标移动到命令行结尾
ctrl+C 强制终止当前命令
ctrl+L 清屏,相当于clear命令
ctrl+U 删除或剪切光标之前的内容
ctrl+K 删除或剪切光标之后的内容
ctrl+Y 粘贴ctrl+U或ctrl+K剪切内容
ctrl+R 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索
ctrl+D 退出当前终端
ctrl+Z 暂停,并放入后台,这个快捷键牵扯工作管理的内容
ctrl+S 暂停屏幕输出
ctrl+Q 恢复屏幕输出
6.标准输入输出
设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出
7.输出重定向
类型 符号 作用
标准输出重定向 命令 > 文件 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中
命令 >> 文件 以追加的方式,把命令的正确输出输出到指定的文件或设备当中
标准错误输出重定向 错误命令 2>文件 以覆盖的方式,把命令的错误输出输出到 指定的文件或设备当中
错误命令 2>>文件 以追加的方式,把命令的错误输出输出到 指定的文件或设备当中
命令 >文件 2>&1 以覆盖的方式将正确输出和错误输出保存至同一个文件当中
命令 >>文件 2>&1 以追加的方式将正确输出和错误输出保存至同一个文件当中
正确输出和错误输出 命令 &>文件 以覆盖的方式将正确输出和错误输出保存至同一个文件当中
同时保存 命令 &>>文件 以追加的方式将正确输出和错误输出保存至同一个文件当中
命令>>文件1 2>>文件2 把正确的输出追加到文件1中,把错误的输出追加到文件2中
8.输入重定向
命令<文件 把文件作为命令的输入
wc [选项] [文件名]
选项:
-c 统计字节数
-w 统计单词数
-l 统计行数
9.多命令顺序执行
命令执行符 格式 作用
; 命令1;命令2 多个命令顺序执行,命令之间没有任和逻辑联系
&& 命令1&&命令2 逻辑与当命令1正确执行,则命令2才会执行当命令1执行不正确,则命令2不会执行
|| 命令1||命令2 逻辑或当命令1执行不正确,则命令2才会执行当命令1正确执行,则命令2不会执行
10.dd命令
dd if=输入文件 of=输出文件 bs=字节数 count=个数
选项
if=输入文件 指定原文件或原设备
of=输出文件 指定目标文件或目标设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看作一个数据块
count=个数 指定输入/输出多少个数据块
例子:创建一个100M的文件,查看当前系统需要多长时间。
date;dd if=/dev/zero of=/root/testfile bs=1k count=100000;date
例子:命令 && echo yes || echo no 判断一条命令是否正确执行
11.管道符
命令格式:命令1 | 命令2 命令1的正确输出作为命令2的操作对象
例子:
ll -a /etc/ | more
netstat -an | grep "ESTABLISHED"
grep [选项] "搜索内容" 文件名
选项
-i 忽略大小写
-n 输出行号
-v 反向查找
--color=auto 搜索出的关键字用颜色显示
12.通配符
通配符 作用
? 匹配一个任意字符
* 匹配0个或任意多个任意字符,也就是可以匹配任何内容
[ ] 匹配中括号中任意一个字符,例如:[abc]代表一个字符,或者a,或者b,或者c
[-] 匹配中括号中任意一个字符,代表一个范围。例如:[a-z]代表匹配一个小写字母
[^] 逻辑非,表示匹配不是中括号内的一个字符,例如:[^0-9]代表匹配一个不是数字的字符
注意:通配符是用来匹配文件名的,其特征是完全匹配。
13.Bash中其他特殊符号
符号 作用
'' 单引号,在单引号中所有的特殊符号。如"$"和"`"都没有特殊含义
"" 双引号,在双引号中特殊符号都没有特殊含义,但是"$","`"和"\"是例外,拥有"调用变量的值","引用命令"和"转义符"的特殊含义
`` 反引号,反引号括起来的内容是系统命令,在Bash中会先执行它,和$()的作用一样,不过推荐使用$(),因为反引号非常容易看错
$() 和反引号作用一样,用来引用系统命令
# 在Shell脚本中,#开头的行代表系统命令
$ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值
\ 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出"$"符号,而不当做是变量引用
第三节 Bash变量
1.什么是变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字
就把它存放在一个变量中,每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用
户相关设置,变量也可以用于保存暂时信息。
2.变量设置规则
变量名称可以由字母,数字和下划线组成,但是不能以数字开头。如果变量名是"2name"则是错误的
在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值类型
变量用等号连接值,等号左右两侧不能有空格
变量的值如果有空格,需要使用单引号或双引号包括
在变量的值中,可以使用"\"转义符
如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用"$变量名"或用${变量名}包含
如果把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令
环境变量名建议大写,便于区分。
3.变量的分类
用户自定义变量
环境变量:这种变量中主要保存的是和系统操作环境相关的数据
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
4.本地变量
变量定义
name="shen chao"
变量叠加
aa=123
aa="$aa"456
aa=${aa}789
变量调用
echo $name
变量查看
set
变量删除
unset name
5.环境变量是什么
用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell中生效。
如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效
6.设置环境变量
export 变量名=变量值 声明变量
env 查询变量
unset 删除变量
pstree可以查看进程树,直接输入shell名可以切换shell
7.系统常见环境变量
PATH:系统查找命令的路径
echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:root/bin
PATH="$PATH":root/sh PATH变量叠加
命令的执行和Tab键的补全都是查找$PATH变量定义的路径
PS1:定义系统提示符的变量
\d 显示日期,格式为"星期 月 日"
\h 显示简写主机名,如默认主机名"localhost"
\t 显示24小时制时间,格式为"HH:MM:SS"
\T 显示12小时制时间,格式为"HH:MM:SS"
\A 显示24小时制时间,格式为"HH:MM"
\u 显示当前用户名
\w 显示当前所在目录的完整路径
\W 显示当前所在目录的最后一个目录
\# 执行的第几个命令
\$ 提示符,如果是root用户会显示为"#",如果是普通用户会显示"$"
8.位置参数变量
位置参数变量 作用
$n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含
$* 这个变量代表命令行中所有参数,$*把所有参数看成一个整体
$@ 这个变量代表命令行中所有参数,$@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数
例子1:
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1 + $num2 ))
echo $sum
例子2:
#!/bin/bash
echo "A total of $# parameters"
echo "The parameters is $*"
echo "The parameters is $@"
例子3:$*与$@的区别
#!/bin/bash
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
for i in "$*"
do
echo "The parameters is:$i"
done
x=1
#$@中的每个参数都看成是独立的,所以$@中有几个参数就会循环几次
for y in "$@"
do
echo "The parameter$x is $y"
x=$(($x+1))
done
9.预定义变量
预定义变量 作用
$? 最后一次执行的命令的返回状态,如果这个变量值为0,证明上一个命令正确执行如果这个变量的值非0,则证明上一个命令执行不正确
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程号(PID)
例子:
#!/bin/bash
#Author:ShenChao(Email:[email protected])
echo "The current process is $$"
#输出当前进程的PID
#这个PID就是variable.sh这个脚本执行时,生成的进程的PID
find /root -name hello.sh &
#使用find命令在root目录下查找hello.sh文件
#符号&的意思是把命令放入后台执行
echo "The last one Daemon process is $!"
10接收键盘输入
read [选项] [变量名]
选项
-p "提示信息" 在等待read输入时,输出提示信息
-t 秒数 read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数 read命令只接受指定的字符数,就会执行,而不用输入回车
-s 隐藏输入的数据,适用于机密信息的输入
例子:
#!/bin/bash
#Author:shenchao(Email:[email protected])
read -t 30 -p "Please input your name: " name
#提示"请输入姓名"并等待30秒,把用户的输入保存入变量name中
echo "Name is $name"
read -s -t 30 -p "Please enter your age:" age
#年龄是隐私,所以我们用"-s"选项隐藏输入
echo -e "\n"
echo "Age is $age"
read -n 1 -t 30 -p "Please select your gender[M/F]: " gender
#使用"-n 1"选项只接收一个输入字符就会执行(都不用输入回车)
echo -e "\n"
echo "Sex is $gender"
第四节 Bash的运算符
1.declare声明变量类型
declare [+/-] [选项] 变量名
选项
- 给变量设定类型属性
+ 取消变量的类型属性
-i 将变量声明为整数型
-x 将变量声明为环境变量
-p 显示指定变量的被声明的类型
2.数值运算
(方法一)
aa=11
bb=22 #给变量aa和bb赋值
declare -i cc=$aa+$bb
(方法二)
aa=11
bb=22 #给变量aa和变量bb赋值
dd=$(expr $aa + $bb) #dd的值是aa和bb的和。注意"+"号左右两侧必须有空格
(方法三)
aa=11
bb=22
ff=$(( $aa+$bb ))
gg=$[ $aa+$bb ]
3.运算符
优先级 运算符 说明
13 -,+ 单目负,单目正
12 !,~ 逻辑非,按位取反或补码
11 *,/,% 乘,除,取模
10 +,- 加,减
9 <<,>> 按位左移,按位右移
8 < =,> =,<,> 小于或等于,大于或等于,小于,大于
7 ==,!= 等于,不等于
6 & 按位与
5 ^ 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑或
1 =,+=,-=,*=,/=,%= 赋值运算且赋值
^=,|=,<<=,>>=
命令实例
aa=$(( (11+3)*3/2 )) 虽然乘和除的优先级高于加,但通过小括号可以调整优先级
bb=$(( 14%3 )) 14不能被3整除,余数是2
cc=$(( 1&&0 )) 逻辑与运算只有相与的两边都是1,结果才是1,否则与的结果是0
4.变量测试与内容替换
变量置换方式 变量y没有值 变量y为空值 变量y设置值
x=${ y-新值 } x=新值 x为空 x=$y
x=${ y:-新值 } x=新值 x=新值 x=$y
x=${ y+新值 } x为空 x=新值 x=新值
x=${ y:+新值 } x为空 x为空 x=新值
x=${ y=新值 } x=新值 x为空 x=$y
y=新值 y值不变 y值不变
x=${ y:=新值 } x=新值 x=新值 x=$y
y=新值 y=新值 y值不变
x=${ y?=新值 } 新值输出到 x为空 x=$y
标准错误输出
x=${ y:?新值 } 新值输出到 新值输出到标 x=$y
标准错误输出 准错误输出
实例命令
测试x=${ y-新值 }
unset y #删除变量y
x=${ y-new } #进行测试
echo $x #输出结果new
因为变量y不存在所以x=new
y="" #给变量y赋值为空
x=${ y-new } #进行测试
echo $x 输出结果""
y=old #给变量y赋值
x=${ y-new } #进行测试
echo $x 输出结果old
第五节 环境变量配置文件
1.source命令
source 配置文件 或 .配置文件
这两条命令使环境变量重新加载,而不用重新登陆再加载。
2.环境变量配置文件简介
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH,HISTSIZE,PS1,HOSTNAME等默认的环境变量。
常见的五个环境变量配置文件
/etc/profile
/etc/bashrc
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
1)/etc/profile的作用:
UER变量:
LOGNAME变量:
MAIL变量:
PATH变量:
HOSTNAME变量:
HISTSIZE变量:
umask
调用/etc/profile.d/*.sh文件:
2)~/.bash_profile的作用
调用了~/.bashrc文件
在PATH变量后面加入了":$HOME/bin"这个目录
3)~/.bashrc的作用
定义默认别名
调用/etc/bashrc
4)/etc/bashrc的作用
PS1变量
umask
PATH变量
调用/etc/profile.d/*.sh文件
3.注销时生效的环境变量配置文件
~/.bash_logout
4.历史命令的保存文件
~/.bash_history
5.Shell登陆信息
本地终端欢迎信息:/etc/issue
转义符 作用
\d 显示当前系统日期
\s 显示操作系统名称
\l 显示登陆的终端号,这个比较常用
\m 显示硬件体系架构,如i386,i686等
\n 显示主机名
\o 显示域名
\r 显示内核版本
\t 显示当前系统时间
\u 显示当前登陆用户的序列号
远程登陆欢迎信息:/etc/issue.net
转义符在/etc/issue.net文件中不能使用
是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入"Banner /etc/issue.net"行才能显示(记得重启SSH服务)
登陆后的欢迎信息:/etc/motd
不管是本地登陆,还是远程登陆,都可以显示此欢迎信息