一.Shell基础
1.Shell的概念:shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行
2.Shell基础:命令,函数,变量等
3.Shell高级:字符的处理方式,流程控制,条件判断等
4.脚本的作用:辅助系统管理员完成复杂的重复性任务
5.写脚本的必要条件 1)熟练掌握Linux系统管理命令
2)学会收集系统内的关键词(判断)
3)流程控制
6.常见的shell类型 1)Bourne shell (sh)
2)C shell (csh)
3)Korn shell (ksh)
4)Bourne Again shell (bash)
注@脚本的开头格式 #!/bin/bash
7.查看Linux中支持的shell类型命令:
cat /etc/shells & 命令后加上(&)符是放置后台运行
二.Shell的执行方式
- echo [选项] [输出内容]
-n #取消输出后行尾的换行符号
-e #支持反斜线(\)控制的字符转化
常用的\控制字符:\n #换行符(enter)
\t #制表符(tab)
\0nnn #按照八进制ASCII码表输出字符,零为数字0,nnn为三位八进制数
\xhh #按照十六进制ASCII码表输出字符,其中hh是两位十六进制数 -
显示颜色
echo -e “\e[31:1mhello world.\e[0m” #固定格式文字颜色:30=黑色,31=红色,32=绿色,33=×××,34=蓝色,35=洋红,36=青色,37=白色,39=结束
底纹颜色:40=黑色,41=红色,42=绿色,43=×××,44=蓝色,45=洋红,46=青色,47=白色,49=结束 - 特殊的控制显示
\e[0m #关闭所有属性
\e[1m #设置高亮度
\e[4m #下划线
\e[5m #闪烁
\e[7m #反显
\e[8m #消隐 -
shell脚本
创建shell脚本文件,一般以 .sh结尾或 .bash结尾
Shell脚本运行方式 1)添加x执行权限(相对或绝对路径执行)
2)用bash命令调用脚本文件
例:vim a.sh #!/bin/bash
echo -e “\e[31;1mhello world.\e[0m” - bash的基本功能
1)历史命令:history
命令格式:history [选项]
-c #清空历史命令
-w #把缓存中的历史命令保存到历史命令的配置文件中History查看到的命令为:配置文件 + 当前shell中的缓存
正常退出用户的情况下,会将用户执行的历史命令保存到对应用户的配置文件中
正常退出命令:exit logout ——> Ctrl+d
历史命令的配置文件:~/.bash_history
2)命令和文件的补全
Bash放在/bin/bash中,它有许多特色可以提供如命令补全,命令编辑,命令历史表等功能,只能在命令行生效,文本文件中无效
3)命令别名
别名格式:alias 别名=‘原命令 [选项]’
两个配置文件:单个用户 ~/.bashrc
所有用户 /etc/bashrc
#注:别名优先级别更高
例:alias grep=‘grep --color=auto’ #显示颜色
Vim写入两个配置文件中,用命令:source [配置文件] #重新加载生效
不同类型的命令执行的顺序:
1)用绝对路径或相对的方式执行命令
2)别名命令
3)bash 内置命令
4)根据环境变量定义的目录查询找到的命令
4)变量
变量:PATH(记录命令存放路径)
查看变量值命令:echo $PATH
-
bash常用快捷键
Ctrl+a #把光标移动到命令行头
Ctrl+e #把光标移动到命令行尾
Ctrl+c #强制终止当前命令
Ctrl+u #删除或剪切光标之前的命令
Ctrl+k #删除或剪切光标之后的命令
Ctrl+y #粘贴Ctrl+u或k的内容
Ctrl+r #在历史命令中搜索
Ctrl+d #退出当前的终端
Ctrl+s #暂停屏幕输出
Ctrl+q #回复屏幕输出
Ctrl+z #暂停,并放入后台{fg:恢复最后一次放入后台的命令}{jobs:查看 在后台暂停的任务列表} -
输出和输入重定向
标准输出:设备文件名 /dev/stdin
#不使用重定向符写入到其它设备或文件内,直接显示到屏幕上的叫做标准输出
输出重定向:1)正确结果的重定向 /dev/stdout
echo “12345”> a.txt
echo “12345”>> a.txt
2) 错误结果重定向 /dev/stderr
lls 2> a.txt #在>前面加上数字2(错误文件描述)
abc 2>> a.txt
3) 正确输出和错误输出同时保存
ls &> a.txt
#以覆盖方式,把正确和错误输出保存到一个文件中
ls &>> a.txt
#以追加方式,把正确和错误输出保存到一个文件中
ls > stdout.txt 2> stderr.txt
#以覆盖方式把正确输出保存到stdout.txt文件中,把错误输出保存到stderr.txt文件中
输入重定向:
命令:wc [选项] [文件名]
-c #统计字数(字符)回车和结束符也算字符数
-w #统计字符串数
-l #统计行数
#实际格式:wc < install.log 一般忽略 < 字符 - 多命令顺序执行连接符
1)命令选项连接符
-a 逻辑与 -o 逻辑或
find ./ -name “abc” -a -type f
2)命令执行连接符
-exec -ok #与exec一样,只是执行时提示是否进行下一步
find ./ -name “abc” -exec ls -ld {}\;
3)命令顺序执行连接符
; {ifdown eth0;ifup eth0} #多个命令顺序执行,命令之间没有逻辑关系
&& {ls && cd /etc/sysconfig} #命令1正确执行,命令2才会执行
{lls && cd /etc/sysconfig} #命令1错误,命令2不能执行
|| {ls || cd /etc/sysconfig} #命令1正确执行,命令2不能执行
{lls || cd /etc/sysconfig} #命令1错误,命令2正常执行
命令:grep [选项] “关键词” 文件名 #行提取命令
-A数字 #列出符合条件的行,并连续列出后续n行
-B数字 #列出符合条件的行,并连续列出前面n行
-c #统计包含字符串共几行
-i #忽略大小写
-n #输出行号
-v #反向查询
4)find和grep的区别
Find:在系统中查找符合条件的文件名,是完全匹配,如果需要模糊查找使用通配符
#搜索时只有完全匹配的才会被查找出来
Grep:是在文件中查找符合条件的字符串,是包含匹配,如果需要精确查询,需要正则表达式(^...$)
#查询关键词时,只要包含关键词的行都被显示出来
-
管道符
1)格式:命令1 | 命令2
#将命令1的标准输出作为命令2的标准输入
ps aux | grep “httpd”
#在进程中过滤Apache服务是否开启
2)xargs 是实现(将标注输出作为命令的选项)
echo “--help” | cat
echo “--help” | xargs cat #把前面命令变为后面命令的选项 -
通配符
? #匹配任意一个字符- #匹配0个字符或任意多个字符,也就是可以匹配任意多个字符
[] #匹配中括号中的任意一个字符
[-] #匹配中括号中的任意一个字符,- 表示连续字符
[^] #逻辑非,表示不是中括号中的一个字符
- #匹配0个字符或任意多个字符,也就是可以匹配任意多个字符
- bash中其它特殊符号
‘ ’ #单引号,在单引号中所有特殊符号都没有特殊含义
“ ” #双引号,在双引号中所有特殊符号都没有特殊含义,但是“$”调用变量“\”转义符“”引用命令例外
`”反引号作用一致
$() #用来引用系统命令 与 “
( ) #用于一串命令执行时,()中的命令会在子shell中运行
{ } #用于一串命令执行时,{}中的命令会在当前shell中执行,也可以用于变量变形和替换
[ ] #用于变量测试在shell脚本中 # 开头的行代表注释
$ #用于调用变量的值,目前用echo $name的方式得到变量的值
\ #转义符,跟在\后面失去特殊含义,如\$输出的$不能当做变量引用
特殊符号的测试:= #赋值 == #等于 判断字符串的
[ ] 变量测试,正确的数值大小判断
-eq 等于 -ne 不等于
-gt 大于 -lt 小于
-ge 大于等于 -le 小于等于
x=10
[ “$x” -gt 9 ] && echo yes || echo no #变量尽量用“”包含
[ ] 变量测试,进行字符串的判断
以下命令格式为固定格式:
== [ “$a” == “$b” ] #必须有空格
< [ “$a” >< “$b” ] #可有可无
<= => [ “$a”<= “$b” ] #不能有空格
=~ [ “$a” =~ “$b” ] #必须有空格 (包含的意思)
( )命令会在子shell中运行
(name=canls;echo $name) pstree 命令显示进程树
#以()中的命令在子shell中运行,不会覆盖或替换当前shell中的变量
{ } 命令会在当前shell中运行
{ name=cangls;echo $name;} 固定格式:左侧{ 与命令有空格,结尾加;
#以{}中的命令会在当前shell中运行,会覆盖或替换当前shell中的变量
- bash变量和运算符
变量概念:计算机语言中能储存计算结果或能表示抽象概念,变量可以同过变量名访问,在指令或语言中变量通常是可变的
1)定义变量的规范:
A. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,变量中间不能有空格。如果变量名是“2name”则是错误的
B. 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型
C. 变量用等号连接值,等号左右两侧不能有空格
D. 变量的值如果有空格,需要使用单引号或双引号包括。如:“test="hello world!"”。其中双引号括起来的内容“$”、“\”和反引号都拥有特殊含义,而单引号括起来的内容都是普通字符
E. 双引号“ ”括起来的 $ \ `` 都有特殊含
F. 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含 "$变量名" 或用 ${变量名} 包含变量名
G. 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令
H. 环境变量名建议大写,易于区分
2)变量的分类:1.用户自定义变量
2.环境变量
3.位置参数变量
4.预定义变量
A)用户的自定义变量
#这种变量是最常见的变量,由用户自由定义变量名和变量的值
变量定义:切记定义变量的规范(空格,名称,引号等)
变量查看:set [选项]
-u #调用没有声明的变量会报错 +u取消
-x #命令执行前,会把命令全格式显示 +x取消
#永久生效写入/etc/profile或 /etc/bashrc配置文件中
set 直接回车显示系统中所有变量(自定义,系统变量等)
unset 变量名 #删除变量
B)环境变量
#这种变量中主要保存的是和系统操作环境相关的数据,比如当前登录用户,用户的家目录,命令的提示符等
环境变量设置:export AGE=“18” #export声明是环境变量
环境变量查询和删除:
env 查看环境变量
env和set的区别:前者只查看环境变量,后者查看所有变量
unset 变量名 #删除环境变量
C)PATH变量 查找系统命令的路径
D)PS1变量 命令提示符设置
格式:PS1=‘[\u@\h \W]\$ ’ #标准格式
\d:显示日期,格式为“星期月日”
\H:显示完整的主机名。如默认主机名“localhost.localdomain”
\h:显示简写主机名。如默认主机名“localhost”
\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提示符为“#”,如果是普通用户提示符为“$”
E)LANG语言变量
配置文件/etc/sysconfig/i18n 语系更改工具xdg-user-dirs-gtk-update
#查询当前所用语言查询 locale 命令
F)位置参数变量
#这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
$n #n为数字,$0代表命令本身,$1-$9代表1-9个参数,10以上用${10}
#利用位置参数编写简单计算器 运算符格式:$(())
$ #这变量代表命令行中所有参数,$把所有参数看为一个整体
$@ #这变量代表命令行中所有参数,不过$@把所有参数区分对待
$# #这变量代表命令行中所有参数的个数
G)预定义变量
#是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
$? #最后一次执行命令的返回状态,如果值为0证明上一个命令执行正确,反则上个命令执行出错
#执行复杂命令时,命令结束后“echo $?”查看上面命令执行时是否有报错
$$ #当前进程的进程号(PID)
$! #后台运行的最后一个进程的进程号(PID)
H)接收键盘输入
格式:read [选项] [变量命]
-p 提示信息 : 在read等待时输入的信息
-t 秒数 : 在read等待的秒数
-n 字符数 : read最多能接收的字符数
-s :隐藏输入信息
#假如特殊选项不换行,用echo来实现换行
变量名定义:
变量名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY
如果只提供了一个变量名,则整个输入行赋予该变量
如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有值
Shell的运算符
数值的运算方法,用declare声明变量类型
格式:declare [-/+] [选项] 变量
- : 给变量设定类型
-
: 取消变量的类型
-a : 将变量声明成数组型
-i : 将变量声明成整数型
-r : 将变量声明成只读(变量值不能修改和删除,不能取消只读选项)-x : 将变量声明成环境变量 -p : 显示指定变量的类型及内容
数组变量:相同类型元素的集合体,同是数字或字母
可以存放N个值,通过数组下标进行多个值之间的分割#[0]为零时,变量就是本身
用expr和let数值运算工具
1)expr运算工具的格式:
#相对了解就好,直到expr是运算工具
2)let运算工具的格式:
3)let还能进行自增增减法或指定增加减少数值
A. 自增&自减格式:
B. 指定增减值格式:指定增减值可以自由调整
使用“$((运算式))”或“$[运算式]”格式进行运算
#两个格式都可以进行数值运算,看个人习惯
两个运算格式:$((运算式)) 在shell脚本中常见
Shell常用的运算符
#运算符的优先级“()的优先级最高”,就是当有多个运算符同时存在时,谁先进行数值计算,但是有时也是有特殊情况的
例如:A.加减乘除
B.取模(取余)运算
#取模运算和取余运算绝大部分是重叠的,但一个是计算机术语,一个是数学概念,区别在于取模运算对负数处理不太一样(被除数为负值时,结果为负,除数正负值不影响结果的正负值)
C.逻辑与运算
#逻辑与(0与1)运算结果0与任何数都得0,只有1与1得1
环境变量的配置文件
#登录系统时生效的环境变量配置文件
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
文件的调用顺序是:
在用户登录过程先调用/etc/profile文件在这个环境变量配置文件中会定义这些默认环境变量:
USER变量:根据登录的用户,给这个变量赋值(就是让USER变量的值是当前用户)。
LOGNAME变量:根据USER变量的值,给这个变量赋值。
MAIL变量:根据登录的用户,定义用户的邮箱为/var/spool/mail/用户名。
PATH变量:根据登录用户的UID是否为0,判断PATH变量是否包含/sbin、 /usr/sbin和/usr/local/sbin这三个系统命令目录。
HOSTNAME变量:更改主机名,给这个变量赋值。
HISTSIZE变量:定义历史命令的保存条数。
umask:定义umask默认权限掩码。注意/etc/profile文件中的umask权限是在“有用户登录过程(也就是输入了用户名和密码)”时才会生效。
调用/etc/profile.d/*.sh文件,也就是调用/etc/profile.d/目录下所有以.sh结尾的文件。
由/etc/profile文件调用/etc/profile.d/*.sh文件
这个目录中所有以.sh结尾的文件都会被/etc/profile文件调用,这里最常用的就是lang.sh文件,而这个文件又会调用/etc/sysconfig/i18n文件。/etc/sysconfig/i18n这个文件眼熟吗?就是我们前面讲过的默认语系配置文件。
由/etc/profile文件调用~/.bash_profile文件。 ~/.bash_profile文件就没有 那么复杂了,这个文件主要实现了两个功能:
调用了~/.bashrc文件。
在PATH变量后面加入了“:$HOME/bin”这个目录。那也就是说,如果我们在自己的家目录中建立bin目录,然后把自己的脚本放入“~/bin”目录,就可以直接执行脚本,而不用通过目录执行了。
由~/.bash_profile文件调用~/.bashrc文件
在~/.bashrc文件中主要实现了:
定义默认别名,所以我们把自己定义的别名也放入了这个文件。
调用/etc/bashrc
由~/.bashrc调用了/etc/bashrc文件在/etc/bashrc文件中主要定 义了这些内容:
PS1变量:也就是用户的提示符,如果我们想要永久修改提示符,就要在这个文件中修改
umask:定义umask默认权限。这个文件中定义的umask是针对“没有登录过程(也就是不需要输入用户名和密码时,比如从一个终端切换到另一个终端,或进入子Shell)”时生效的。如果是“有用户登录过程”,则是/etc/profile文件中的umask生效。
PATH变量:会给PATH变量追加值,当然也是在“没有登录过程”时才生效。
调用/etc/profile.d/.sh文件,这也是在“没有用户登录过程”是才调用。在“有用户登录过程”时,/etc/profile.d/.sh文件已经被/etc/profile文件调用过了。
这样这五个环境变量配置文件会被依次调用,那么如果是我们自己定义的环境变量应该放入哪个文件呢?如果你的修改是打算对所有用户生效的,那么可以放入/etc/profile环境变量配置文件;如果你的修改只是给自己使用的,那么可以放入~/.bash_profile或~/.bashrc这两个配置文件中的任一个。
可是如果我们误删除了这些环境变量,比如删除了/etc/bashrc文件,或删除了~/.bashrc文件,那么这些文件中配置就会失效(~/.bashrc文件会调用/etc/bashrc文件)。那么我们的提示符就会变成:
登录显示信息配置文件
/etc/issue #在用户登录前显示Linux版本和内核版本
/etc/issue #再远程登录也可以看到欢迎信息,也是在用户登录前显示
/etc/motd #该文件也是用户登录欢迎提示信息,在用户登录后显示需要自己编辑