第十讲 Shell编程
第十讲 Shell基础
一、概述
1.1 Shell是什么
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以
用Shell来启动,挂起,停止甚至是编写一些程序。
Shell还是一个功能强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以
直接调用Linux系统命令。
1.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。
1.3 Linux支持的Shell
/etc/shells
二、Shell脚本的执行方式
2.1 echo 输出命令
命令格式:echo [选项] [输出内容]
选项:
-e 支持反斜线控制的字符转换
控制字符 | 作用 |
\\ | 输出\本身 |
\a | 输出警告音 |
\b | 退格键,也就是向左的删除键 |
\c | 取消输出行末的换行符,和"-n"选项一致 |
\e | ESCAPE键 |
\f | 换页键 |
\n | 换行符 |
\r | 回车键 |
\t | 制表符,也就是tab键 |
\v | 垂直制表符 |
\0nnn | 按照八进制ASCll码表输出字符,其中0为数字0,nnn为3位八进制数 |
\xhh | 按照十六进制ASCll码表输出字符。其中hh为2位十六进制数 |
范例:echo -e “\e[1;31m abcd \e[0m” #输出红色的abcd
#输出颜色 30m~黑色 31m~红色 32m~绿色 33m~黄色
34m~蓝色 35m~洋红 36m~青色 37m~白色
2.2 第一个脚本
vi hello.sh
#!bin/Bash(不是注释,标注以下为shell程序)
#The first Programm
#Author:testuser
echo -e "Mr. Su is the most honest man in China"
2.3 脚本执行
2.3.1 赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh
2.3.2 通过Bash调用执行脚本
bash hello.sh
2.3.3 dos2unix
三、Bash基本功能
3.1 历史命令与补全
3.1.1 历史命令 history
a)命令格式:history [选项] [历史命令保存文件]
选项:
-c 清空历史命令
-w 把缓存中的历史命令吸入历史命令保存文件 ~/.bash_history
b)历史命令会默认保存1000条,可以在环境变量配置文件/etc/profile中进行修改
c)历史命令的调用
使用上、下箭头调用以前的历史命令
使用"!n" 重复执行第n条历史命令
使用"!!" 重复执行上一条命令
使用"!字串"重复执行最后一条以该字串开头的命令
3.1.2 命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按”Tab“键就会自动进行补全
按两次Tab会列出所有满足补全条件的命令或文件
3.2 别名与快捷键
3.2.1 命令别名
命令格式:alias 别名=”原命令“ #设定命令别名
alias #查询命令别名
命令执行顺序:
1 第一顺位执行用绝对路径或相对路径执行命令
2 第二顺位执行别名
3 第三顺位执行Bash的内部命令
4 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
让别名永久生效:vi /root/.bashrc
删除别名:unalias 别名
3.2.2 Bash常用快捷键
快捷键 | 作用 |
ctrl+A | 把光标移动到命令行开头,如果我们输入的命令过长时使用 |
ctrl+E | 把光标移动到命令行结尾 |
ctrl+C | 强制终止当前命令 |
ctrl+L | 清屏,相当于clear |
ctrl+U | 删除或剪切光标之前的内容 |
ctrl+K | 删除或剪切光标之后的内容 |
ctrl+Y | 粘贴ctrl+U或ctrl+K剪切的内容 |
ctrl+R | 在历史命令中搜索 |
ctrl+D | 退出当前终端 |
ctrl+Z | 暂停,并放入后台 |
ctrl+S | 暂停屏幕输出 |
ctrl+Q | 恢复屏幕输出 |
3.3 输入输出重定向
3.3.1 标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
3.3.2 输出重定向
类型 | 符号 | 作用 |
标准输出重定向 | 命令>文件 |
以覆盖的方式,把命令的正确输出输出到指定文件 或设备当中 |
命令>>文件 |
以追加的方式,把命令的正确输出输出到指定的文 件或设备当中 |
|
标准错误输出重定向 | 错误命令 2>文件 |
以覆盖的方式,把命令的错误输出输出到指定的文 件或设备当中 |
错误命令 2>>文件 |
以追加的方式,把命令的错误输出输出到指定的文 件或设备当中 |
|
正确输出和错误输出 同时保存 |
命令 > 文件 2>&1 |
以覆盖的方式,把正确输出和错误输出都保存到同 一个文件当中 |
命令 >> 文件 2>&1 |
以追加的方式,把正确输出和错误输出都保存到同 一个文件当中 |
|
命令 &> 文件 |
以覆盖的方式,把正确输出和错误输出都保存到同 一个文件当中 |
|
命令 &>> 文件 |
以追加的方式,把正确输出和错误输出都保存到同 一个文件当中 |
|
命令 >> 文件1 2>> 文件2 |
把正确的输出追加到文件1当中,把错误输出追加 到文件2当中 |
3.3.2 输入重定向
命令格式:wc [选项] [文件名]
选项:
-c 统计字节数
-w 统计单词数
-l 统计行数
ctrl+D进行统计键盘输入的信息
命令 < 文件 把文件作为命令的输入
3.4 多命令顺序执行与管道符
3.4.1 多命令顺序执行
多命令执行符 | 格式 | 作用 |
; | 命令1 ; 命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& | 命令1&&命令2 |
逻辑与 当命令1正确执行,则命令2才会执行 当命令1执行不正确,则命令2不会执行 |
|| | 命令1||命令2 |
逻辑或 当命令1执行不正确,则命令2才会执行 当命令1正确执行,则命令2不会执行 |
dd if=输入文件 of=输出文件 bs=字节数 count=个数(此命令可作为磁盘或大文件等的复制)
选项:
if=输入文件 指定源文件或源设备
of=输出文件 指定目标文件或目标设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数 指定输入/输出多少个数据块
例如:date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
命令 && echo yes || echo no (此命令可判断命令是否被正确执行)
3.4.2 管道符
命令格式:命令1 | 命令2
#命令1的正确输出作为命令2的操作对象
例如:
ll -a /etc/ | more
netstat -an | grep "ESTABLISHED"
命令格式:grep [选项] "搜索内容" 文件名
选项:
-i 忽略大小写
-n 输出行号
-v 反向查找
--color=auto 将搜索出的关键字用颜色显示
3.5 通配符和其他特殊符号
3.5.1 通配符
通配符 | 作用 |
? | 匹配一个任意字符 |
* | 匹配0个或任意多个任意字符 |
[] |
匹配括号中任意一个字符。例如:[abc] 代表一定匹配一个字符,或者是a 或者是b,或者是c |
[-] | 匹配括号中任意一个字符,-代表一个范围。例如[a-z]代表匹配一个小写字母 |
[^] |
逻辑非,表示匹配不是中括号内的一个字符,例如:[^0-9]代表匹配一个不是数字的字符 |
3.5.2 Bash中其他特殊符号
符号 | 作用 |
'' | 单引号,在单引号中所有的特殊符号,如"$"和"`"(反引号)都没有特殊含义 |
"" |
双引号,在双引号中特殊符号都没有特殊含义,但"$"、"`"、"\"是例外, 拥有"调用变量的值"、"引用命令"、"转义符"的特殊含义 |
` |
反引号。反引号括起来的内容是系统命令,在Bash中会先执行它,和$()作用 一样,不过推荐使用$(),因为反引号非常容易看错 |
$() | 用来引用系统变量 |
# | 在Shell脚本中,#开头代表注释 |
$ |
用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到 变量的值 |
\ |
转义符。即跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出"$" ,而不当做是变量的引用 |
四、Bash变量
4.1 用户自定义变量
4.1.1 什么是变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或一个数字,就把
它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设
置,变量也可以用于保存暂时信息。
4.1.2 变量设置规则
a)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
b)在Bash中,变量的默认类型都是字符串型,如果要进行数值计算,则必须指定变量的类型为数值型。
c)变量用等号连接值,等号左右两侧不能有空格。
d)变量的值如果有空格,则需要使用单引号或双引号括起来。
e)在变量的值中,可以使用"\"转义符。
f)如果需要增加变量的值,可以进行变量值的叠加。不过变量需要用双引号包含"$变量名"或用${变量名}包含。
g)如果把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
h)环境变量建议大写,便于区分。
4.1.3 变量的分类
a)用户自定义变量
b)环境变量:主要保存和系统操作环境相关的数据
c)位置参数变量:主要用来向脚本当中传递参数或数据,变量名不能自定义,变量作用是固定的。
d)预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量的作用也是固定的。
4.1.4 本地变量
变量定义:name="test user"
变量叠加:
aa=123
aa="$aa"456
aa=${aa}789
变量调用:echo $name
变量查看:set
变量删除:unset name
4.2 环境变量
4.2.1 环境变量定义
用户自定义变量只在当前Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell中都有效。如果把
环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中都生效。
4.2.2 设置环境变量
export 变量名=变量值 #声明变量
evn #查询变量
unset 变量名 #删除变量
4.2.3 常用环境变量
PATH:系统查找命令的路径
变量叠加:PATH="$PATH":/root/sh
PS1:定义系统提示符的变量
\d:显示日期,格式为“星期 月 日”;
\h:显示简写主机名,如默认主机名为localhost
\t:显示24小时制时间,格式为"HH:MM:SS"
\T:显示12小时制时间,格式为"HH:MM:SS"
\A:显示24小时时间,格式为"HH:MM"
\u:显示当前用户名
\w:显示当前所在目录的完整目录
\W:显示当前所在目录的最后一个目录
\#:执行的第几个命令
\$:提示符,如果是root用户会显示提示符为“#”,如果是普通用户则显示提示符为"$"
4.3 位置参数变量
4.3.1 位置参数变量
位置参数变量 | 作用 |
$n |
n为数字,$0代表命令本身,$1-$9代表第一到第 九个参数,十以上的参数需要用大括号包含,如${10} |
$* | 代表命令行中所有的参数,把所有参数看成一个整体 |
$@ | 代表命令行中所有的参数,将每个参数区分对待 |
$# | 代表命令行中所有参数的个数 |
4.4 预定义变量
4.4.1 预定义变量
预定义变量 | 作用 |
$? |
最后一次执行的命令的返回状态,如果这个变量的值为0,证明 上个命令正确执行,否则表示上个命令执行不正确 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
4.4.2 接收键盘输入
read [选项] [变量名]
选项:
-p “提示信息” 在等待read输入时,输出提示信息
-t "秒数" read命令会一直等待用户输入,此选项指定等待时间
-n “字符数” read命令只接收指定的字符数,就会执行
-s 隐藏输入的数据,适用于机密信息的输入
五、Bash的运算符
5.1 数值运算与运算符
5.1.1 declare 声明变量类型
命令格式:declare [+/-] [选项] [变量名]
选项:
-: 给变量设定类型属性
+: 取消变量的类型属性
-i: 将变量声明为整数型(interger)
-x: 将变量声明为环境变量
-p: 显示指定变量的被声明类型
5.1.2 数值运算
aa=11
bb=22
a)方法1:声明cc为数值类型
declare -i cc=$aa+$bb
b)方法2:expr或let数值运算工具
dd=$(expr $aa + $bb) #注意,“+”号两边必须要有空格
c)方法3:”$((运算式))“或“$[运算式]”
ff=$(($aa+$bb))
gg=$[$aa+$bb]
5.1.3 运算符
优先级 | 运算符 | 说明 |
13 | -、+ | 单目负、单目正 |
12 | !、^ | 逻辑非、按位取反或补码 |
11 | *、/、% | 乘、除、取模 |
10 | +、- | 加、减 |
9 | <<、>> | 按左位移、按右位移 |
8 | <=、>=、<、> | 小于或等于、大于或等于、小于、大于 |
7 | ==、!= | 等于、不等于 |
6 | & | 按位与 |
5 | | | 按位异或 |
4 | | | 按位或 |
3 | && | 逻辑与 |
2 | || | 逻辑或 |
1 |
=、+=、-=、 *=、/=、%= <<=、>>= |
赋值、运算且赋值 |
5.2 变量测试与内容替换
变量置换方式 | 变量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=新值 y=新值 |
x为空 y值不变 |
x=$y y值不变 |
x=${y:=新值} |
x=新值 y=新值 |
x=新值 y=新值 |
x=$y y值不变 |
x=${y?新值} |
新值输出到标 准错误输出(屏幕) |
x为空 | x=$y |
x=${y:?新值} |
新值输出到标 准错误输出(屏幕) |
新值输出到标 准错误输出 |
x=$y |
六、环境变量配置文件
6.1 环境变量配置文件简介
6.1.1 重新加载配置文件
命令格式:source 配置文件或 . 配置文件
6.1.2 环境变量配置文件简介
定义对系统的操作环境生效的系统默认环境变量。比如:PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量。
6.1.3 环境变量配置文件
a)/etc/profile
b)/etc/profile.d/*.sh
c)~/.bash_profile
d)~/.bashrc
e)/etc/bashrc
注意:etc下的配置文件对所有用户都生效。c和d只对当前家用户生效
6.2 环境变量配置文件作用
6.2.1 /etc/profile的作用
a)USER变量:
b)LOGNAME变量:
c)MAIL变量
d)PATH变量
e)HOSTNAME变量
f)HISTSIZE变量
g)umask:
h)调用/etc/profile.d/*.sh文件
6.2.2 ~/.bash_profile的作用
a)调用了~/.bashrc文件
b)在PATH变量后面加入了":$HOME/bin"这个目录
6.2.3 ~/.bashrc的作用
a)定义系统别名
b)调用了/etc/bashrc
6.2.4 /etc/bashrc的作用(不需要输入用户名和密码,直接登录的情况下)
a)定义PS1变量
b)umask
c)PATH变量
d)调用/etc/profile.d/*.sh文件
6.3 其他配置文件和登录信息
6.3.1 注销时生效的环境变量配置文件
~/.bash_logout
6.3.2 其他配置文件
~/.bash_history #历史命令配置文件
6.3.3 Shell登录信息
a)本地终端欢迎信息:/etc/issue
转义符 | 作用 |
/d | 显示当前的系统日期 |
/s | 显示操作系统名称 |
/l | 显示登录的终端号,比较常用 |
/m | 显示硬件体系结构。如i386、i686等 |
/n | 显示主机名 |
/o | 显示域名 |
/r | 显示内核版本 |
/t | 显示当前系统时间 |
/u | 显示当前登录用户的虚列号 |
b)远程终端欢迎信息:/etc/issue.net
转义符在/etc/issue.net文件中不能使用
是否显示欢迎信息,由ssh配置文件/etc/ssh/sshd_config决定,加入"Banner /etc/issue.net"行才能显示
记得要重新启动SSH服务
c)登录后欢迎信息:/etc/motd
不管是本地登录还是远程登录,都可以显示此欢迎信息