shell学习笔记-Shell手册

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 配置文件 或 . 配置文件

环境变量配置文件

登录时生效的环境变量配置文件
  1. /etc/profile
  2. /etc/profile.d/*.sh
  3. ~/.bash_profile
  4. ~/.bashrc
  5. /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端口

变量

变量规则

  1. 变量名称和所有语言基本一样 由字母,数字和下划线组成,但不能以数字开头
  2. 在Bash中,变量的默认类型都是字符串型
  3. 变量赋值用等号连接,等号左右两侧不能有空格
  4. 变量的值如果有空格,需要使用单引号或双引号包括
  5. 如果需要增加变量的值可以进行变量值的叠加.例: test=123;test=" t e s t " 456 或 t e s t = test"456或test= test"456test={test}456

变量的分类

  1. 用户自定义的变量 : 由用户自由定义变量名和值
  2. 环境变量 :主要保存和系统操作环境相关的数据,环境变量名可以自由定义,但一般对系统起作用的环境变量的变量名都是系统预先设定好的
  3. 位置参数变量 :这种变量主要是用来向脚本中传递参数或数据的,变量名不能自定义,变量作用也是固定的
  4. 预定义变量:是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三种数值运算方法
  1. declare -i c=1+2

  2. c=$(expr 1 + 2) 或 let c=1+2

  3. 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这种形式获取

一些命令待补充…

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值