一.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的执行方式

  1. echo [选项] [输出内容]
    -n #取消输出后行尾的换行符号
    -e #支持反斜线(\)控制的字符转化
    常用的\控制字符:\n #换行符(enter)
    \t #制表符(tab)
    \0nnn #按照八进制ASCII码表输出字符,零为数字0,nnn为三位八进制数
    \xhh #按照十六进制ASCII码表输出字符,其中hh是两位十六进制数
  2. 显示颜色
    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=结束

  3. 特殊的控制显示
    \e[0m #关闭所有属性
    \e[1m #设置高亮度
    \e[4m #下划线
    \e[5m #闪烁
    \e[7m #反显
    \e[8m #消隐
  4. shell脚本
    创建shell脚本文件,一般以 .sh结尾或 .bash结尾
    Shell脚本运行方式 1)添加x执行权限(相对或绝对路径执行)
    2)用bash命令调用脚本文件
    例:vim a.sh #!/bin/bash
    echo -e “\e[31;1mhello world.\e[0m”

  5. 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
  1. 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:查看 在后台暂停的任务列表}

  2. 输出和输入重定向
    标准输出:设备文件名 /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 一般忽略 < 字符

  3. 多命令顺序执行连接符
    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)格式:命令1 | 命令2
    #将命令1的标准输出作为命令2的标准输入
    ps aux | grep “httpd”
    #在进程中过滤Apache服务是否开启
    2)xargs 是实现(将标注输出作为命令的选项)
    echo “--help” | cat
    echo “--help” | xargs cat #把前面命令变为后面命令的选项

  2. 通配符
    ? #匹配任意一个字符

    • #匹配0个字符或任意多个字符,也就是可以匹配任意多个字符
      [] #匹配中括号中的任意一个字符
      [-] #匹配中括号中的任意一个字符,- 表示连续字符
      [^] #逻辑非,表示不是中括号中的一个字符
  3. 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中的变量

  1. 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 #该文件也是用户登录欢迎提示信息,在用户登录后显示需要自己编辑