Shell基础
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 恢复屏幕输出
多命令执行符
多命令执行符 格式 作用
; 命令1 ; 命令2 多个命令顺序执行, 命令之间没有任何逻辑联系
&& 命令1 && 命令2 只有命令1正确执行 ($?=0), 命令2才会执行
|| 命令1 || 命令2 只有命令1执行不正确 ($?≠0), 命令2才会执行
输入输出重定向
标准输入输出
设备文件名 文件描述符 类型
/dev/stdin 0 标准输入
/dev/stdout 1 标准输出
/dev/stderr 2 标准错误输出
输出重定向
类型 符号 (>表示覆盖, >>表示追加)
标准输出重定向 命令 > 文件 或 命令>> 文件
标准错误输出重定向 命令 2>文件 或 命令 2>>文件
标准和错误输出同时保存 命令 > 文件 2>&1 或 命令 >> 文件 2>&1
命令 &>文件 或 命令 &>>文件
标准和错误输出分开保存 命令 >>文件1 2>>文件2
通配符
通配符 作用
? 匹配一个任意字符
* 匹配0个或任意多个字符
[] 匹配中括号中任意一个字符
[-] 匹配中括号中任意一个字符 - 代表一个范围
[^] 逻辑非, 表示匹配不是中括号内的一个字符
Bash中其它特殊符号
符号 作用
' ' 单引号, 在单引号中所有的特殊符号, 如 $和 ` `都没有特殊含义
" " 双引号,在双引号中所有的特殊符号, 但 $(调用变量的值)和\(转义符)和``(引用命令)是例外
` ` 反引号,反引号括起来的内容是系统命令,在Bash中会先执行它,和$()作用一样,推荐使用$()
$() 和反引号作用一样
() 用于一串命令执行时,()中的命令会在子Shell中运行
{} 用于一串命令执行时,{} 中的命令会在当前Shell中执行,也可以用于变量变形与替换
[] 用于变量的测试
# 在Shell脚本中 #开头的行代表注释
$ 用于调用变量的值
\ 转义符
小括号和大括号
()执行一串命令时,需要重新开一个子shell进行执行
{}执行一串命令时,是在当前shell执行\
()和{}都是把一串命令放在括号里面,并且命令之间用;号隔开
()最后一个命令可以不用分号
{}最后一个命令要用分号
{}的第一个命令和左括号之间必须要有一个空格
()里的命令不必和括号有空格
{}和()里的某个命令重定向只影响该命令,但括号外的重定向则影响括号里的所有命令
环境变量配置文件
source
重新加载环境变量配置文件
source 配置文件 或 . 配置文件
环境变量配置文件
登录时生效的环境变量配置文件
- /etc/profile
- /etc/profile.d/*.sh
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
环境变量配置文件调用过程
注销时生效的环境变量配置文件
~/.bash_logout
其它配置文件
如 ~/bash_history 历史命令保存文件
Shell登录信息
/etc/issue
在登录tty1-tty6这六个本地终端时显示的欢迎界面
issue支持转义符 man agetty命令可查询转义符
常见转义符:
转义符 作用
\d 显示当前系统日期
\s 显示操作系统名称
\l 显示登录的终端号
\m 显示硬件体系结构
\n 显示主机名
\o 显示域名
\r 显示内核版本
\t 显示当前系统时间
\u 显示当前登录用户的序列号
/etc/issue.net
在远程登录(telnet,ssh)时显示的欢迎界面
不支持转义符
ssh登录时是否显示取决于 /etc/ssh/sshd-config里面的配置
Banner /etc/issue.net
/etc/motd
本地登录和远程登录都会显示,
和/etc/issue(.net)区别:
motd:是在用户输入正确的用户和密码登录之后才显示的
issue(.net): 是用户登录之前
定义Bash快捷键
stty -a 查询所有的快捷键
stty 关键字 快捷键
例: stty intr ^p
强制终止 ^表示ctrl
命令
echo 打印输出
echo [选项] [输出内容]
选项:
-e 支持反斜线控制的字符转换
-n 取消输出后行末的换行符号
echo 支持给字体加上颜色或背景
echo -e "\e[1;31m abcd \e[0m"
\e[1 是标准格式,代表颜色输出开始, \[e0m代表颜色输出结束, 3x字体颜色 4x背景颜色
30m 黑色,31m 红色,32m 红绿,33m 黄色,34m 蓝色,35m 洋红,36m 青色,37m 白色
40m 黑色,41m 红色,42m 红绿,43m 黄色,44m 蓝色,45m 洋红,46m 青色,47m 白色
printf 格式化输出
printf '输出类型格式' 输出内容
输出类型:
%ns 输出字符串 n输出几个,可省略
%ni 输出整数 n输出几个,可省略
%m.nf 输出浮点数 m总位数,n
输出格式:
\a 输出警告声音
\b 输出退格键
\f 清除屏幕
\n 换行
\r 回车
\t 水平tab制表
\v 垂直tab制表
history 历史命令
history [选项] [历史命令保存文件 ]
选项:
-c 清空历史命令
-w 把缓存中的历史命令写入文件 (如果不手工指定保存文件,则默认保存在 ~/.bash_history)
/etc/profile环境变量中 HISTSIZE即历史命令缓存的条数
历史命令调用
上下箭头调用以前的历史命令
!n 重复执行第n条历史命令
!! 重复执行上一条命令
!字符串 重复执行最后一条以该字符串开头的命令
!$ 重复一上条命令的最后一个参数
alias 命令别名
alias 别名='原命令'
alias 查询系统中已经定义好的别名
wc 统计
wc [选项] [文件名 ]
选项:
-c 统计字节数
-w 统计单词数
-l 统计行数
wc统计命令结果中会带有文件名如果不想出现文件名请使用 "cat 文件名 | wc -参数"
find查找文件
find默认情况下是用通配符查找,也可以通过 -regex选项识别正则表达式
read 接收键盘输入
read [选项] [变量名]
选项:
-p "提示信息" 在等待read输入时,输出提示信息
-t "秒数" 指定等待时间会一直等待用户输入,
-n "字符数" 只接受指定的字符数
-s 隐藏输入的数据,如密码
变量名
如果不指定变量名,使用默认变量 REPLY
只提供一个变量名,则输入整行赋于该变量
如提供一个以上变量名,则输入行分为若干字,一个接一个地赋于各个变量,最后一个变量取得剩余的所有字
cut 列提取命令
cut [选项] [文件名]
选项:
-f 列号 提取第几列
-d 分隔符 按照指定分隔符分割列(默认是制表符),对空格支持的不好
-c 字符范围 不依赖分割符来分割列,通过字符范围(行首为0)来进行字段提取
n- 第n个字符到行尾
n-m 第n个字符到第m个字符
-m 第1个字符到第m个字符
sort 排序命令
sort [选项] 文件名
选项:
-f 忽略大小写
-b 忽略每行前的空白部分
-n 以数值型进行排序(默认字符串)
-r 反向排序
-u 删除重复行(就是uniq命令)
-t 指定分隔符(默认是tab制表符)
-k n[,m] 按照指定字段范围排序,从第n个字段开始,m字段结束(默认到行尾)
uniq 删除重复行
uniq [选项] 文件名
选项:
-i 忽略大小写
nmap 端口扫描命令
nmap [选项] 域名或IP
选项:
-s 扫描
-T 扫描所有开启的TCP端口
变量
变量规则
- 变量名称和所有语言基本一样 由字母,数字和下划线组成,但不能以数字开头
- 在Bash中,变量的默认类型都是字符串型
- 变量赋值用等号连接,等号左右两侧不能有空格
- 变量的值如果有空格,需要使用单引号或双引号包括
- 如果需要增加变量的值可以进行变量值的叠加.例: test=123;test=" t e s t " 456 或 t e s t = test"456或test= test"456或test={test}456
变量的分类
- 用户自定义的变量 : 由用户自由定义变量名和值
- 环境变量 :主要保存和系统操作环境相关的数据,环境变量名可以自由定义,但一般对系统起作用的环境变量的变量名都是系统预先设定好的
- 位置参数变量 :这种变量主要是用来向脚本中传递参数或数据的,变量名不能自定义,变量作用也是固定的
- 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
用户自定义变量
变量定义
name="haha"
变量调用
echo $name
变量查看
set [选项]
选项:
-u 如果设定此选项,调用未声明变量时会报错(默认无任何提示)
-x 如果设定此选项,在命令执行之前会把命令先输出一次
变量删除
unset 变量名
环境变量
环境变量设置
export age="18"
环境变量删除和查询
unset age
env | grep age
env命令和set命令的区别是,set命令可以查看所有变量,而env命令只能查看环境变量
系统默认环境变量
PATH:PATH变量的值是用 : 分割的路径,新添加一个临时生效 PATH="$PATH":/root/sh
PS1:命令提示符设置,格式 PS1='[\u@\t \w]\$ ' 变量的值要用单引号包含,否则设置不生效
PS1支持以下选项:
\d 显示日期,格式为 星期 月 日
\H 显示完整的主机名
\h 显示简写的主机名
\t 显示24小时制时间 HH:MM:SS
\T 显示12小时制时间 HH:MM:SS
\A 显示24小时制时间 HH:MM
\@ 显示12小时制时间 HH:MM am/pm
\u 显示当前用户名
\v 显示Bash版本信息
\w 显示当前所在目录的完整名称
\W 显示当前所在目录的最后一个目录
\# 执行的第几个命令
\$ 用户提示符 root是#,普通用户是$
LANG语系变量
locale:查看当前系统使用什么语系
LANG定义的语系只对当前系统生效,如果想要永久生效需要修改 /etc/sysconfig/i18n或/etc/locale.conf
cat /etc/sysconfig/i18n --> LANG="zh_CN.UTF-8"
位置参数变量
位置参数变量 作用
$n n为数字, $0代表命令本身,$1-$9代表第一到第九个参数,十以上参数需要用大括号包含,如${10}
$* 代表命令行中所有的参数,把所有的参数看成一个整体
$@ 代表命令行中所有的参数,把每个参数区分对待
$# 代表命令行中所有参数的个数
预定义变量
预定义变量 作用
$? 返回最后一次执行命令的状态值
$$ 当前进程的进程号PID
$! 后台运行的最后一个进程的进程号PID
变量测试与内容置换
变量置换方式 变量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?新值} 新值 2> x为空 x=$y
x=${y:?新值} 新值 2> 新值 2> x=$y
ps: 新值 2> :表示新值输出到标准错误输出
Shell运算符
declare声明变量类型
declare [+/-][选项] 变量名
选项:
- 给变量设定类型属性
+ 取消变量的类型属性
-a 将变量声明为数组型
-i 将变量声明为整数型 integer
-r 将变量声明为只读变量(一旦设置为只读变量,就不能修改变量的值,也不能删除,甚至不能通过+r取消只读属性)
-x 将变量声明为环境变量
-p 显示指定变量的被声明的类型
shell中数值运算
shell三种数值运算方法
-
declare -i c=1+2
-
c=$(expr 1 + 2) 或 let c=1+2
-
c= ( ( 1 + 2 ) ) 或 c = (( 1+2 )) 或 c= ((1+2))或c=[ 1+2 ]
推荐使用 c=$(( 1+2 ))
Shell常用运算符
优先级 运算符 说明
13 -, + 单目负, 单目正
12 !, ~ 逻辑非, 按位取反或补码
11 * , / , % 乘 除 取模
10 +, - 加减
9 << , >> 按左位移, 按右位移
8 <=, >=, < , > 小于等于,大于等于,小于,大于
7 ==, != 等于, 不等于
6 & 按位与
5 ^ 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑或
1 =,+=,-=,*=
%=,&=,^= 赋值,运算且赋值
|=,<<=,>>=
正则,文本三剑客
正则表达式
三剑客 grep awk sed都支持正则表达式
基础正则表达式
元字符 作用
* 前一个字符匹配0次或任意多次
. 匹配除了换行符外的任意一个字符
^ 匹配行首
$ 匹配行尾
[] 匹配括号中指定的任意一个字符
[^] 匹配括号中的字符以外的任意一个字符
\ 转义符
\{n\} 表示前面的字符出现n次
\{n,\} 表示前面的字符出现不小n次
\{n,m\} 表示前面的字符至少出现n次,最多出现m次
当使用扩展正则时 {}不再需要转义符
扩展正则表达式
扩展元字符 作用
+ 前一个字符匹配1次或者任意多次
? 前一个字符匹配0次或1次
| 匹配两个或多个分支选择
() 匹配其整体为一个字符,即模式单元
grep
grep [选项] "搜索内容" 文件名
选项:
-A 数字 列出符合条件的行,并列出后续的n行
-B 数字 列出符合条件的行,并列出前面的n行
-c 统计找到的符合条件的字符串的次数
-i 忽略大小写
-n 输出行号
-v 反向查找
--color=auto 搜索出的关键字用颜色显示
-E 支持扩展正则
awk
命令格式
awk '条件1 {动作1} 条件2 {动作2} ...' 文件名
条件
条件:一般使用关系表达式作为条件
awk的条件:
条件的类型 条件 说明
awk保留字 BEGIN 在awk程序一开始时,未读取任何数据之前执行,BEGIN后的运行只在程序开始时执行一次
awk保留字 ENG 在awk程序处理完数据,即将结束时执行,ENG后的运行只在程序开始时执行一次
关系运算符 > 大于
关系运算符 < 小于
关系运算符 >= 大于等于
关系运算符 <= 小于等于
关系运算符 == 等于(判断两个值是否相等)
关系运算符 != 不等于
关系运算符 A~B 判断A中是否包含能匹配B表达式
关系运算符 A!~B 判断A中是否不包含能匹配B表达式
正则表达式 A~/正则/ //中支持字符,也支持正则表达式(如果不写A~ 则整行 即$0)
动作:
格式化输出
流程控制语句
awk内置变量
变量名 作用
$0 代表当前读入行的整行数据
$n 代表目前读入行的第n个字段
NF 当前行拥有的字段(列)总数
NR 当前所处理的行在总数据的第几行
FS 用户定义分隔符(默认是空格) (需要在BEGIN中使用)
ARGC 命令行参数个数
ARGV 命令行参数数组
FNR 当前文件中的当前记录数(起始为1)
OFMT 数值的输出格式(默认为%.6g)
OFS 输出字段的分隔符(默认是空格)
ORS 输出记录分隔符(默认为换行符)
RS 输入记录分隔符(默认为换行符)
awk函数
函数定义方法:
function 函数名 (参数列表){函数体}
示例:
awk 'function test(a, b) {print a "\t" b} { test($2, $5) }' test.txt
awk脚本
awk条件和动作可以事先写入文件(一行一句)然后再调用
格式: awk -f test.awk test.txt
sed
sed主要用来将数据进行选取,替换,删除,新增的命令
sed [选项] '[动作]' 文件名
选项:
-n sed会把所有数据都输出到屏幕,加此参数只把经过sed处理的行输出到屏幕
-e 允许对输入数据应用多条sed命令编辑
-f 脚本名 加载sed脚本
-r 支持扩展正则
-i 直接修改文件,而不是屏幕输出
动作:
a \ 追加,在当前行后添加一行或多行.添加多行时需要用 \表示数据未完结
c \ 行替换, c后面的字符串替换原数据行.添加多行时需要用 \表示数据未完结
i \ 插入,在当前行插入一行或多行.添加多行时需要用 \表示数据未完结
d 删除指定的行
p 打印指定的行 示例: sed -n '2p' test.txt 打印第二行
s 字符串替换 格式: '行范围s/旧字符串/新字符串/g' 斜杠也可以用#代替
Shell编程
条件判断
按照文件类型进行判断
判断选项 作用
-b 文件 判断文件是否存在,并且是否为块设备文件
-c 文件 判断文件是否存在,并且是否为字符设备文件
-d 文件 判断文件是否存在,并且是否为目录文件
-e 文件 判断文件是否存在
-f 文件 判断文件是否存在,并且是否为普通文件
-L 文件 判断文件是否存在,并且是否为符号链接文件
-p 文件 判断文件是否存在,并且是否为管道文件
-s 文件 判断文件是否存在,并且是否为非空
-S 文件 判断文件是否存在,并且是否为套接字文件
按照文件权限进行判断
判断选项 作用
-r 文件 判断文件是否存在,并且是否拥有读权限
-w 文件 判断文件是否存在,并且是否拥有写权限
-x 文件 判断文件是否存在,并且是否拥有执行权限
-u 文件 判断文件是否存在,并且是否拥有SUID权限
-g 文件 判断文件是否存在,并且是否拥有SGID权限
-k 文件 判断文件是否存在,并且是否拥有SBit权限
两个文件之间进行比较
判断选项 作用
文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新
文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧
文件1 -ef 文件2 判断文件1是否和文件2的Inode号一致(判断是否同一文件或硬链接)
两个整数之间比较
判断选项 作用
整数1 -eq 整数2 判断整数1是否和整数2相等
整数1 -ne 整数2 判断整数1是否和整数2不相等
整数1 -gt 整数2 判断整数1是否大于整数2
整数1 -lt 整数2 判断整数1是否小于整数2
整数1 -ge 整数2 判断整数1是否大于等于整数2
整数1 -le 整数2 判断整数1是否小于等于整数2
字符串的判断
判断选项 作用
-z 字符串 判断字符串是否为空
-n 字符串 判断字符串是否为非空
字串1 == 字串2 判断两个字符串是否相等
字串1 != 字串2 判断两个字符串是否不相等
多重条件判断
判断选项 作用
判断1 -a 判断2 逻辑与,相当于and
判断1 -o 判断2 逻辑或,相当于or
! 判断 逻辑非,相当于not
流程控制
if
单分支if条件语句
格式:
if [ 条件判断式 ];then
程序
fi
如果then不放在第一行,就不用写分号
if [ 条件判断式 ]
then
程序
fi
双分支if条件语句
格式:
if [ 条件判断式 ]
then
程序
else
程序
fi
多分支if条件语句
格式:
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
...省略更多条件...
else
程序
fi
case
格式:
case $变量名 in
"值1")
程序
;;
"值2")
程序
;;
...省略其它分支...
*)
以上都不满足,执行这个默认
;;
esac
for循环
语法一:
for 变量 in 值1 值2 值3 值4 值5
do
程序
done
语法二:
for (( 初始值;循环控制条件;变量变化))
do
程序
done
示例:
for (( i=1;i<=100;i=i+1))
do
程序
done
while循环
格式:
while [ 条件判断式 ]
do
程序
done
until循环
until循环和while循环相反 只有条件判断式不成立时才执行循环
格式:
until [ 条件判断式 ]
do
程序
done
特殊流程控制语句
exit
作用:退出shell脚本
格式: exit [返回值]
返回值: 可自定义,退出后通过 $?来查询,如果没有定义返回值,则返回执行exit语句前一条命令的返回值
break
作用: 退出当前循环
continue
作用: 结束本次循环
Shell中的函数
定义:
function 函数名 () {
程序
}
使用: 函数名
注: Shell函数没有形参,传参只能用位置参数,在函数里面使用 $1-$9这种形式获取