一.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
- 错误结果重定向 /dev/stderr lls 2> a.txt #在>前面加上数字2(错误文件描述) abc 2>> a.txt
- 正确输出和错误输出同时保存 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个字符或任意多个字符,也就是可以匹配任意多个字符 [] #匹配中括号中的任意一个字符 [-] #匹配中括号中的任意一个字符,- 表示连续字符 [^] #逻辑非,表示不是中括号中的一个字符
- 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 #该文件也是用户登录欢迎提示信息,在用户登录后显示需要自己编辑