第8章 Shell基础
📝 Linux学习笔记 - 第8章 🎯 共6节
本章目录
Shell概述
什么是Shell
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
Shell的分类
- Bourne Shell:主文件名为sh
- C Shell:BSD版本的Shell,语法类似C语言
Bourne家族:
- Bourne Shell(sh)
- Korn Shell(ksh)
- Bourne Again Shell(bash)
- POSIX Shell(sh)
C家族:
- C Shell(csh)
- tcsh
Linux的标准Shell是bash
Linux支持的Shell
cat /etc/shells
# 查看系统支持的Shell可以直接输入Shell名称切换:
sh
csh
zsh
# 等等Shell脚本的执行方式
echo输出命令
echo [选项] [输出内容]| 选项 | 说明 |
|---|---|
| -e | 支持反斜线控制的字符转换 |
控制字符:
| 控制字符 | 作用 |
|---|---|
| \ | 输出\本身 |
| \a | 输出警告音 |
| \b | 退格键,也就是向左删除键 |
| \c | 取消输出行末的换行符。和”-n”选项一致 |
| \e | ESCAPE键 |
| \f | 换页符 |
| \n | 换行符 |
| \r | 回车键 |
| \t | 制表符,也就是Tab键 |
| \v | 垂直制表符 |
| \0nnn | 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数 |
| \xhh | 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数 |
示例:
echo -e "a\tb\tc\nd\te\tf"
# 输出带制表符和换行的内容
echo -e "\e[1;31m 红色文字 \e[0m"
# 输出带颜色的文字
# 30m=黑色 31m=红色 32m=绿色 33m=黄色
# 34m=蓝色 35m=洋红 36m=青色 37m=白色第一个脚本
#!/bin/bash
# 第一个脚本
echo -e "\e[1;34m 天上掉下个林妹妹 \e[0m"脚本执行
方式一:赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh方式二:通过Bash调用执行脚本
bash hello.shBash的基本功能
历史命令
history [选项] [历史命令保存文件]| 选项 | 说明 |
|---|---|
| -c | 清空历史命令 |
| -w | 把缓存中的历史命令写入历史命令保存文件~/.bash_history |
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
实际历史命令保存的位置为: /root/.bash_history
历史命令的调用
- 使用上、下箭头调用以前的历史命令
- 使用
!n重复执行第n条历史命令 - 使用
!!重复执行上一条命令 - 使用
!字串重复执行最后一条以该字串开头的命令
命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按”Tab”键就会自动进行补全。
命令别名
alias 别名='原命令'
# 设定命令别名
alias
# 查询命令别名命令执行时顺序
- 第一顺位执行用绝对路径或相对路径执行的命令
- 第二顺位执行别名
- 第三顺位执行Bash的内部命令
- 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
让别名永久生效
vi /root/.bashrc删除别名
unalias 别名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 | 恢复屏幕输出 |
标准输入输出
| 设备 | 设备文件名 | 文件描述符 | 类型 |
|---|---|---|---|
| 键盘 | /dev/stdin | 0 | 标准输入 |
| 显示器 | /dev/stdout | 1 | 标准输出 |
| 显示器 | /dev/stderr | 2 | 标准错误输出 |
输出重定向
| 类型 | 符号(格式) | 作用 |
|---|---|---|
| 标准输出重定向 | 命令 > 文件 | 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中 |
| 命令 >> 文件 | 以追加的方式,把命令的正确输出输出到指定的文件或设备当中 | |
| 标准错误输出重定向 | 错误命令 2> 文件 | 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中 |
| 错误命令 2>> 文件 | 以追加的方式,把命令的错误输出输出到指定的文件或设备当中 | |
| 正确输出和错误输出同时保存 | 命令 > 文件 2>&1 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 |
| 命令 >> 文件 2>&1 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中 | |
| 命令 &> 文件 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 | |
| 命令 &>> 文件 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中 | |
| 命令 >> 文件1 2>> 文件2 | 把正确的输出追加到文件1中,把错误的输出追加到文件2中 |
ls &>/etc/null
# 把输出结果指向null,相当于垃圾箱,不存在的黑洞输入重定向
wc [选项] [文件名]| 选项 | 说明 |
|---|---|
| -c | 统计字节数 |
| -w | 统计单词数 |
| -l | 统计行数 |
wc << hello
# 在输入的内容中遇到hello时才会结束并统计结果多命令顺序执行
| 多命令执行符 | 格式 | 作用 |
|---|---|---|
| ; | 命令1;命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
| && | 命令1&&命令2 | 逻辑与:当命令1正确执行,则命令2才会执行;当命令1执行不正确,则命令2不会执行 |
| || | 命令1||命令2 | 逻辑或:当命令1执行不正确,则命令2才会执行;当命令1正确执行,则命令2不会执行 |
示例:
ls ; date ; cd /user ; pwd
dd if=输入文件 of=输出文件 bs=字节数 count=个数| 选项 | 说明 |
|---|---|
| if=输入文件 | 指定源文件或源设备 |
| of=输出文件 | 指定目标文件或目标设备 |
| bs=字节数 | 指定一次输入/输出多少字节,即把这些字节看做一个数据块 |
| count=个数 | 指定输入/输出多少个数据块 |
date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
# 拷贝指定大小的文件,用两个日期时间来判断所用的时间
ls anaconda-ks.cfg && echo yes
# 当ls命令正确执行后输出yes,错误则不输出
ls /root/test || echo "no"
# 当ls命令错误执行后输出no,正确执行则不输出
命令 && echo yes || echo no
# 当命令正确执行后输出yes,当echo yes没有正确执行则输出no管道符
命令格式:
命令1 | 命令2- 命令1的正确输出作为命令2的操作对象
示例:
ll -a /etc/ | more
# 用 ll (ls -l) 以分页模式显示/etc/下所有的文件
netstat -an | grep "ESTABLISHED"
# 显示网络状态中包含"ESTABLISHED"的字段grep命令:
grep [选项] "搜索内容" 文件名| 选项 | 说明 |
|---|---|
| -i | 忽略大小写 |
| -n | 输出行号 |
| -v | 反向查找 |
| —color=auto | 搜索出的关键字用颜色显示 |
通配符
| 通配符 | 作用 |
|---|---|
| ? | 匹配一个任意字符 |
| * | 匹配0个或任意多个任意字符,也就是可以匹配任何内容 |
| [] | 匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者是a,或者是b或者是c |
| [-] | 匹配中括号中任意一个字符,-代表一个范围。例如:[a-z]代表匹配一个小写字母 |
| [^] | 逻辑非,表示匹配不是中括号内的一个字符。例如:[^0-9]代表匹配一个不是数字的字符 |
示例:
cd /tmp/
rm -rf *
# 删除/tmp/下所有文件
touch abc
touch abcd
touch 012
touch 0abc
ls ?abc
# 匹配?abc,?必须匹配一个字符
# 输出:0abc
ls [0-9]*
# 匹配包含一个0-9数字开头的任何文件
# 输出:012 0abc
ls [^0-9]*
# 匹配不含数字开头的任何文件
# 输出:abc abcdBash中其他特殊符号
| 符号 | 作用 |
|---|---|
| ” | 单引号。在单引号中所有的特殊符号,如”$“和”`“(反引号)都没有特殊含义 |
| "" | 双引号。在双引号中特殊符号都没有特殊含义,但是”$”、”`“和""是例外 |
| “ | 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它 |
| $() | 和反引号作用一样,用来引用系统命令 |
| # | 在Shell脚本中,#开头的行代表注释 |
| $ | 用于调用变量的值 |
| \ | 转义符,跟在\之后的特殊符号将失去特殊含义 |
单引号与双引号
name=sc
echo '$name'
# 输出:$name
echo "$name"
# 输出:sc
echo '$(date)'
# 输出:$(date)
echo "$(date)"
# 输出:当前日期时间反引号与$()
echo `ls`
# 输出ls命令结果,相当于执行ls
echo $(date)
# 输出date命令,相当于执行date
# 推荐使用$(),因为反引号非常容易看错Bash的变量
用户自定义变量
什么是变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。
变量设置规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头
- 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型
- 变量用等号连接值,等号左右两侧不能有空格
- 变量的值如果有空格,需要使用单引号或双引号包括
- 在变量的值中,可以使用""转义符
- 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含”{变量名}包含
- 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令
- 环境变量名建议大写,便于区分
变量分类
- 用户自定义变量
- 环境变量:这种变量中主要保存的是和系统操作环境相关的数据
- 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
- 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
本地变量
name="shen chao"
# 定义变量
echo $name
# 调用变量变量叠加:
aa=123
aa="$aa"456
# 或者
aa=${aa}789变量查看:
set
# 查询系统中所有变量变量删除:
unset 变量名
# 删除变量环境变量
什么是环境变量
用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。
设置环境变量
export 变量名=变量值
# 声明环境变量
env
# 查询环境变量
unset 变量名
# 删除变量系统常见环境变量
- PATH:系统查找命令的路径
echo $PATH
# 查看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用户会显示提示符为”#“,如果是普通用户会显示提示符为”$“ |
位置参数变量
| 位置参数变量 | 作用 |
|---|---|
| $n | n为数字,1-{10} |
| $* | 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体 |
| $@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
| $# | 这个变量代表命令行中所有参数的个数 |
示例:
#!/bin/bash
echo $0
echo $1
echo $2
echo $3预定义变量
| 预定义变量 | 作用 |
|---|---|
| $? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确了 |
| $$ | 当前进程的进程号(PID) |
| $! | 后台运行的最后一个进程的进程号(PID) |
接收键盘输入
read [选项] [变量名]| 选项 | 说明 |
|---|---|
| -p “提示信息” | 在等待read输入时,输出提示信息 |
| -t 秒数 | read命令会一直等待用户输入,使用此选项可以指定等待时间 |
| -n 字符数 | read命令只接受指定的字符数,就会执行 |
| -s | 隐藏输入的数据,适用于机密信息的输入 |
示例:
#!/bin/bash
read -t 30 -p "请输入你的姓名:" name
echo $name
read -s -t 30 -p "请输入你的年龄:" age
echo -e "\n"
echo $age
read -n 1 -t 30 -p "请输入你的性别[M/F]:" gender
echo -e "\n"
echo $genderBash的运算符
数值运算的方法
declare声明变量类型
declare [+/-][选项] 变量名| 选项 | 说明 |
|---|---|
| - | 给变量设定类型属性 |
| + | 取消变量的类型属性 |
| -a | 将变量声明为数组型 |
| -i | 将变量声明为整数型(integer) |
| -r | 将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过+r取消只读属性 |
| -x | 将变量声明为环境变量 |
| -p | 显示指定变量的被声明的类型 |
示例:数值运算
aa=11
bb=22
declare -i cc=$aa+$bb
echo $ccexpr或let数值运算工具
aa=11
bb=22
cc=$(expr $aa + $bb)
# cc的值是aa和bb的和
# 注意:"+"号左右两侧必须有空格”[运算式]“
aa=11
bb=22
cc=$(( $aa + $bb ))
# 或者
dd=$[ $aa + $bb ]运算符
| 优先级 | 运算符 | 说明 |
|---|---|---|
| 13 | -, + | 单目负、单目正 |
| 12 | !, ~ | 逻辑非、按位取反或补码 |
| 11 | *, /, % | 乘、除、取模 |
| 10 | +, - | 加、减 |
| 9 | <<, >> | 按位左移、按位右移 |
| 8 | ⇐, >=, <, > | 小于或等于、大于或等于、小于、大于 |
| 7 | ==, != | 等于、不等于 |
| 6 | & | 按位与 |
| 5 | ^ | 按位异或 |
| 4 | | | 按位或 |
| 3 | && | 逻辑与 |
| 2 | || | 逻辑或 |
| 1 | =, +=, -=, *=, /=, %=, &=, ^=, |=, <⇐, >>= | 赋值、运算且赋值 |
示例:
#!/bin/bash
echo $(( (11+22)*3/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 |
环境变量配置文件
环境变量配置文件简介
环境变量配置文件的功能
系统中有些环境变量如PATH、HISTSIZE、PS1、HOSTNAME等,这些变量是系统启动时就自动加载的,因为它们写入了环境变量配置文件中。
配置文件的生效顺序
环境变量配置文件有好几个,它们有一个生效顺序,我们先看一下这些配置文件的作用。
环境变量配置文件
/etc/profile
系统级别的环境变量配置文件,对所有用户都生效。
主要修改的变量:
- USER
- LOGNAME
- PATH
- HOSTNAME
- HISTSIZE
- umask
/etc/bashrc
系统级别的bash配置文件,对所有用户都生效。
主要修改的变量:
- PS1
- umask
- PATH
~/.bash_profile
用户级别的环境变量配置文件,只对当前用户生效。
~/.bashrc
用户级别的bash配置文件,只对当前用户生效。
~/.bash_logout
用户注销时执行的配置文件。
~/.bash_history
历史命令保存文件。
配置文件加载顺序
登录Shell时的加载顺序:
/etc/profile~/.bash_profile~/.bashrc/etc/bashrc
注意:
/.bash_profile会调用/.bashrc,而~/.bashrc会调用/etc/bashrc
其他配置文件和登录信息
注销时生效的环境变量配置文件
~/.bash_logout
历史命令
~/.bash_history
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
不管是本地登录,还是远程登录,都可以显示此欢迎信息。