Shell概述
什么是Shell
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell还是一个功能强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
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。
Linux中支持的Shell
/etc/shells
Shell脚本的执行方式
echo
输出命令
echo [选项] 输出内容
常用选项
-e
:支持反斜线\
控制的字符转换
echo
也支持颜色输出:
echo -e "\e[1; [颜色代码] [输出内容] \e[0m"
颜色代码
30m
:黑色
31m
:红色
32m
:绿色
33m
:黄色
34m
:蓝色
35m
:洋红
36m
:青色
37m
:白色
操作截图
第一个脚本
vim hello.sh
键入以下内容:
说明:第一行#!/bin/bash
不能省略,不是注释内容!
执行脚本
【推荐】方式一:
赋予执行权限,直接运行,
chmod 755 hello.sh
./hello.sh
方式二:
通过bash调用执行脚本,可以连执行权限都可以不用设置
bash hello.sh
Bash的基本功能
历史命令与命令补全
history [选项] [历史命令保存文件]
常用选项
-c
:清空历史命令
-w
:把缓存中的历史命令写入到历史命令保存文件,默认位置~/.bash_history
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile
中进行修改!
历史命令的调用
- 使用上、下箭头调用以前的历史命令
- 使用
!n
重复执行第n条历史命令 - 使用
!!
重复执行上一条命令 - 使用
!字串
重复执行最后一条以该字串开头的命令
命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按Tab
键,就会自动进行补全。
命令别名和常用快捷键
命令别名
alias 别名='原命令'
定义别名,但是此种方式定义的别名只会临时生效。
alias
查询命令别名
命令的执行顺序
- 第一顺序执行用绝对路径或相对路径执行的命令。
- 第二顺序执行别名。
- 第三顺序执行Bash的内部命令。
- 第四顺序执行按照
$PATH
环境变量定义的目录查找顺序找到的第一个命令。
让别名永久生效
需要写入下面的文档中:
vim ~/.bashrc
删除别名
unalias 别名
Bash常用快捷键
输入输出重定向
标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
输出重定向
输入重定向
wc [选项] [文件名]
常用选项:
-c
:统计字节数
-w
:统计单词数
-l
:统计行数
wc
统计下面输入的内容,按Ctrl
+D
结束输入,得到的结果分别代表:行数,单词数(包含换行符),字节数。
命令 < 文件输入
把文件作为命令的输入
多命令顺序执行与管道符
多命令顺序执行
多命令执行符 | 格式 | 作用 |
---|---|---|
; | 命令1;命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& | 命令1&&命令2 | 逻辑与。当命令1正确执行,命令2才会执行;当命令1执行不正确,则命令2不会执行 |
|| | 命令1||命令2 | 逻辑或。当命令1执行不正确,命令2才会执行;当命令1执行正确,命令2不会执行。 |
dd
命令
dd if=输入文件 of=输出文件 bs=字节数 count=个数
选项
if=输入文件
:指定原文件或原设备
of=输出文件
:指定目标文件或目标设备
bs=字节数
:指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数
:指定输入/输出多少个数据块
管道符|
命令1 | 命令2
命令1 的正确输出作为 命令2 的操作对象。
命令1必须有正确的输出命令2才能执行
grep
grep [选项] 搜索内容 文件名
常用选项:
-i
:忽略大小写
-n
:输出行号
-v
:反向查找
--color=auto
:搜索出的关键字用颜色显示
通配符和特殊符号
通配符
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或任意多个任意字符,也就是可以匹配任何内容 |
[] | 匹配括号中的任意一个字符。例如:[abc] 代表一定匹配一个字符,或者是a ,或者是b ,或者是c |
[-] | 匹配括号中任意一个字符,- 代表一个范围。例如:[a-z] 代表匹配一个小写字母 |
[^] | 逻辑非。代表匹配不是括号中的一个字符。例如:[^0-9] 代表匹配一个不是数字的字符 |
通配符是用来匹配文件名的!
Bash中的其它特殊符号
符号 | 作用 |
---|---|
'' | 单引号。在单引号中的所有特殊符号,如$ 和`` `都没有特殊含义 |
"" | 双引号。在双引号中特殊符号都没有特殊含义,但是$ 、`` 和 `是例外,拥有”调用变量的值“,”引用命令“和”转义符“的特殊含义 |
`` | 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$() 作用一样,不过推荐使用$() ,因为反引号非常容易看错。 |
$() | 和反引号作用一样,用来引用系统命令 |
# | 在Shell脚本中,# 开头的行表示注释 |
$ | 用于调用变量的值,如需要调用变量name的值时,需要用$name 的方式得到变量的值 |
\ | 转义符。跟在\ 之后的特殊符号将失去特殊含义,变为普通字符。如\$ 将输出$ 符号,而不是当作变量引用 |
Bash的变量
用户自定义的变量
什么是变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用的信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
变量设置规则
- 变量名可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是
2name
,则是错误的。 - 在Bash中,变量的默认类型都是字符串类型,如果要进行数值计算,则必须指定变量类型为数值型。
- 变量用等号连接值,等号左右两侧不能有空格。
- 变量的值如果有空格,需要使用单引号或者双引号包括。
- 在变量的值中,可以使用
\
转义符。 - 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含
$变量名
或使用${变量名}
包含。 - 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或
$()
包含命令。 - 环境变量名建议大写,便于区分。
变量的分类
-
用户自定义变量
-
变量定义:
变量名=变量值
-
变量叠加:
-
查看变量:
set
-
删除变量:
unset 变量名
-
-
环境变量:这种变量中主要保存的是系统操作环境相关的数据。
-
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
-
预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
环境变量
环境变量是什么
用户自定义的变量只在当前的Shell中生效,而环境变量会在当前的Shell和这个Shell的所有子Shell中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。
设置环境变量
声明变量:export 变量名=变量值
查询变量:env
删除变量:unset 变量名
系统常见环境变量
PATH
:系统查找命令的路径
添加自己的环境变量
PATH="$PATH":[要添加的环境变量]
PS1
:定义系统提示符的变量
PS1
无法使用env
指令来查看,只能使用set
看到
位置参数变量
位置参数变量 | 作用 |
---|---|
$n | n 为数字,$0 代表命令本身,$1~$9 代表第1到9个参数,10及以上的参数需要使用大括号包含,如${10} |
$* | 这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过$@ 把每个参数区别对待 |
$# | 这个参数代表命令行中所有参数的个数 |
关于$*
和$@
的区别
#!/bin/bash
# 观察 $@ 和 $* 的区别
echo "第一个for循环"
for i in "$*"
do
echo $i
done
echo "第二个for循环"
for y in "$@"
do
echo $y
done
执行结果
预定义变量
预定义变量 | 作用 |
---|---|
$? | 最后一次的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确。 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行最后一个进程的进程号(PID) |
接收键盘输入
read [选项] [变量名]
选项:
-p 提示信息
:在等待read输入时,输出提示信息
-t 秒数
:read指令会一直等待用户输入,使用此选项可以制定等待时间
-n 字符数
:read指令只接收指定的字符数,就会执行
-s
:隐藏输入的数据,适用于机密信息的输入
#!/bin/bash
# 输入姓名,等待30秒,把用户输入保存到变量name中
read -t 30 -p "请输入姓名:" name
echo "刚刚输入的姓名是:$name"
# 输入年龄,年龄是隐私,使用-s选项隐藏输入
read -s -t 30 -p "请输入年龄:" age
echo -e "\n"
echo "刚刚输入的年龄是:$age"
# 输入性别,使用-n选项,只接受一个字符就会执行
read -n 1 -t 30 -p "请输入性别(M/F):" gender
echo -e "\n"
echo "刚刚输入的性别是:$gender"
Bash的运算符
数值运算和运算符
在Bash中,无法直接使用+
-
*
/
进行数值运算
方法一:declare
声明变量类型
declare [+/-] [选项] 变量名
选项
-
:给变量设定类型属性
+
:取消变量的类型属性
-i
:将变量声明为整数型
-x
:将变量声明为环境变量
-p
:显示指定变量的被声明类型
实现上面的数值运算
方法二:expr
或let
数值运算工具
实现上面的数值运算
上面的+
两侧必须有空格
【推荐】方法三:$((运算式))
或$[运算式]
运算符
变量测试与内容替换
测试表达式x=${y-新值}
环境变量配置文件
环境变量配置文件简介
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH
、HISTSIZE
、PS1
、HOSTNAME
等默认环境变量。
source 配置文件
或. 配置文件
配置文件直接立即生效
常见的环境变量配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
~/.bash_profile
~/.bashrc
/etc
下的配置文件会对任何登录用户都生效
环境变量配置文件作用
环境变量配置文件的生效顺序
其中,/etc/profile
文件作用:
USER
变量LOGNAME
变量MAIL
变量PATH
变量HOSTNAME
变量HISTSIZE
变量umask
- 调用
/etc/profile.d/*sh
文件
其它配置文件和登录信息
注销时生效的环境变量配置文件
~/.bash_logout
其它配置文件
~/bash_history
Shell登录信息
本地终端欢迎信息:/etc/issue
远程终端欢迎信息:/etc/issue.net
- 转义符在
/etc/issue.net
文件中不能使用 - 是否显示欢迎信息,由ssh的配置文件
/etc/ssh/sshd_config
决定,加入Banner /etc/issue.net
行才能显示(需要重启ssh服务)
登录后欢迎信息:/etc/motd
不管是本地登录,还是远程登录,都可以显示此欢迎信息。
其中,/etc/profile
文件作用:
USER
变量LOGNAME
变量MAIL
变量PATH
变量HOSTNAME
变量HISTSIZE
变量umask
- 调用
/etc/profile.d/*sh
文件
其它配置文件和登录信息
注销时生效的环境变量配置文件
~/.bash_logout
其它配置文件
~/bash_history
Shell登录信息
本地终端欢迎信息:/etc/issue
远程终端欢迎信息:/etc/issue.net
- 转义符在
/etc/issue.net
文件中不能使用 - 是否显示欢迎信息,由ssh的配置文件
/etc/ssh/sshd_config
决定,加入Banner /etc/issue.net
行才能显示(需要重启ssh服务)
登录后欢迎信息:/etc/motd
不管是本地登录,还是远程登录,都可以显示此欢迎信息。