Shell的概述


shell是一个命令解释器

shell的分类

  1. Bourne shell :bourne shell 的主文件名为sh

  2. shell的两种主要语法有Bourne 和C 两种,彼此不兼容。Bourne家族主要包括sh,ksh,Bash,psh,zsh;C家族主要包括cdh,tcsh

  3. Bash: bash与sh兼容,现在的liunx就是使用bash为基本的shell

liunx支持的shell

1
2
[ root@localhost ~ ] $ vi /etc/shells 
//查看支持的shell



Shell脚本的执行方式


echo输出命令

1
2
3
4
  [ root@localhost ~ ] $ echo [ 选项 ] [ 输出内容 ]

选项:
-e --支持反斜线控制的字符转换

控制字符列表:

控制字符 作用
\\ 输出“\”本身
a 输出警告音
b 退格键,向左删除“b”
c 取消输出行末的换行符。
e ESCAPE键
f 换页符
n 换行符
r 回车键
t 制表符,也就是Tab键
v 垂直指标符
0nnn 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数
xhh 按照十六进制ASCII表输出字符,其中hh是两位进制数

示例:

1
2
3
4
5
6
7
[ root@localhost ~ ] $ echo -e "abbc" 
--删除左字符“b”

[ root@localhost ~ ] $ echo -e "atbtcndtetf"
--制作表与换行符

[ root@localhost ~ ] $ echo -e "e[1;31m abcd e]0m" --输出颜色

颜色表:

30m 黑色
31m 红色
32m 绿色
33m 黄色
34m 蓝色
35m 洋红
36m 青色
37m 白色

第一个脚本

1
2
3
4
5
6
7
8
9
10
11
12
[ root@localhost sh ] $ cat > hello.sh 
#创建一个为 hello.sh 的shell脚本

[ root@localhost sh ] $ vi hello.sh

#!/bin/Bash

#The first program

#Author:yiyang (E-mail:2970401025@qq.com)

echo -e "the man is a good people " #输入内容

脚本执行

1
2
3
4
5
6
7
[ root@localhost sh ] $ chmod 755 hello.sh 
//赋予执行权限

# ./hello.sh 运行脚本

[ root@localhost sh ] $ bash hello.sh
//通过bash调用执行脚本



Bash的基本功能


历史命令与命令补全

  1. 历史命令:
1
2
3
4
5
6
7
8
[ root@localhost ~ ] $ history [ 选项 ] [ 历史命令保存文件 ]

选项:
-c --清除历史命令

-w --把缓存的历史命令写入历史命令保存文件 ~./bash.history

//补充: 历史命令默认保存为1000条,可在配置文件 /etc/profile 中进行修改
  1. 历史命令的调用:
  • 上,下键 调用以前的历史命令

  • !n 重复执行第n条历史命令

  • !! 重复执行上一条命令

  • “!字串” 重复执行最后一条以该字串开头的命令

  1. 命令与文件补全: Tab 键自动补全命令

  2. 命令别名与常用快捷键:

    • 命令别名:
    1
    2
    3
    4
    [ root@localhost ~ ] $ alias 别名=“原命令” 
    //设定命令别名

    [ root@localhost ~ ] $ alias --查询命令别名
    • 命令执行顺序:

>1. 第一顺位执行绝对路径或相对路径执行的命令 > >2. 第二顺位执行别名 > >3. 第三顺位执行bash的内部命令 >4. 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
- 让命令别名永久生效:

1
2
[ root@localhost ~ ] $ vi /root/.bashrc 
//添加别名内容
  • 删除命令别名:
1
[ root@localhost ~ ] $ unalias 命令别名
- 常用快捷键:如图1 ![](/some森-onenote/Centos-教程/centos笔记图组/shell1.png)



输入输出重定向

  1. 标准输入输出:
设备 设备文件名 文件描述 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/sdtout 1 标准输出
显示器 /dev/sdterr 2 标准错误输出
  1. 输出重定向:
类型 符号 作用
标准输出重定向 命令 >文件 以覆盖方式把命令的正确输出到指定的文件或设置中
标准输出重定向 命令 >>文件 以追加方式把命令的正确输出到指定的文件或设置中
标准错误输出重定向 错误命令 2>文件 以覆盖方式把命令的错误输出到指定的文件或设置中
标准错误输出重定向 错误命令 2>>文件 以追加方式把命令的错误输出到指定的文件或设置中
  • 正确的输出与错误的输出同时保存:
符号 作用
命令 >文件 2>&1 以覆盖方式把命令的正确输出和错误输出都保存到同一文件或设置中
命令 >>文件 2>&1 以追加方式把命令的正确输出和错误输出都保存到同一文件或设置中
命令 &>文件 以覆盖方式把命令的正确输出和错误输出都保存到同一文件或设置中
命令 &>>文件 以追加方式把命令的正确输出和错误输出都保存到同一文件或设置中
错误命令 >>文件1 2>>文件2 把正确的输出追加到文件1,错误的输出追加到文件2
  1. 输入重定向:
1
2
3
4
5
6
7
8
[ root@localhost ~ ] $ wc [ 选项 ] 文件名

选项:
-c --统计字节数

-w --统计单词数

-l --统计行数
  • 使用:

    1
    2
    [ root@localhost ~ ] $ 命令 <文件 
    //把文件作为命令的输入



多命令顺序执行与管道符

  1. 多命令执行顺序:
多命令执行符 格式 作用
; 命令1; 命令2 多个命令顺序执行,命令之间没有逻辑关系
&& 命令1 && 命令2 ”与“,当命令1正确执行,则命令2才会执行,反之,则命令2不会执行
|| 命令1|| 命令2 ”或“,当命令1执行不正确,则命令2执行,反之,则不会执行

示例:

1
2
3
4
5
[ root@localhost ~ ] $ ls anaconda-ks.cfg && echo yes

[ root@localhost ~ ] $ ls /root/test || echo "no

[ root@localhost ~ ] $ 命令 && echo yes || echo no

磁盘复制:

1
2
3
4
5
6
7
8
9
10
[ root@localhost ~ ] $ dd if=输入文件 of=输出文件 bs=字节数 count=个数

//参数说明:
if --指定源文件或原设备

of --指定目标文件或目标设备

bs --指定一次输入或输出多少字节,字节相当于一个数据块

count --指定输入或输出多少个数据块

示例:

1
[ root@localhost ~ ] $ date; dd if=/dev/zer0 of=/root/testfile bs=1k count=100000; date
  1. 管道符:

    命令格式:

    1
    [ root@localhost ~ ] $ 命令1 | 命令2 命令1的正确输出作为命令2的操作对象

    示例:

    1
    2
    3
    [ root@localhost ~ ] $ ll -a /etc/ | more

    [ root@localhost ~ ] $ netstat -an | grep "ESTABLISHED"



通配符与其他特殊符号

  1. 通配符:
通配符 作用
匹配任意一个字符
* 匹配0个或任意多个任意字符
[ ] 匹配中括号中任意一个字符。例:[ abc ], 可以是a或b或c
[ - ] 匹配中括号中任意一个字符,- 代表一个范围,例:[ a-z ],代表匹配a到z的任意一个字母
[ ^ ] ”非“,表示匹配不是括号中的一个字符,例:[ ^0-9 ],代表匹配一个不是数字的字符

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[ root@localhost ~ ] $ rm -rf /*

[ root@localhost ~ ] $ touch abc

[ root@localhost ~ ] $ touch abcd

[ root@localhost ~ ] $ touch abcd

[ root@localhost ~ ] $ touch 012

[ root@localhost ~ ] $ touch 0bcd

[ root@localhost ~ ] $ ls ?abc

[ root@localhost ~ ] $ ls [0-9]*

[ root@localhost ~ ] $ ls [^0-9]
  1. 其他特殊符号:
符号 作用
‘ ? ’ 单引号中所有的特殊符号,都没有特殊含义(如:$ 和 ` )
”?“ 双引号中除 $ 和 和 以外的特殊符号都没有特殊含义($:特殊变量值 :引用命令 :转义符)
` ? ` 反引号中内容是系统命令,在bash中与 $() 一致
$( ? ) 与反引号一致,用来引用系统命令
# 表示注释
$ 用于调用变量的值,如 需要调用name的变量值则用 $name=***来表达
转义符,跟在之后的特殊符号不具有特殊含义,变为普通字符,如:$ 则只输出$本身符号,而不具有调用变量值的含义



Bash的变量


用户自定义变量

  1. 变量概述:

变量是计算机内存的单元,其中存放的值可以改变。当shell脚本需要保存一些信息时,把一个文件名或一个数值存放在一个变量中。

每一个变量都会有一个名字,可以很方便保存有用的信息。

  1. 变量设置规则:
  • 变量名可以由数字与字母和下划线组成,但不能以数字开头。如 变量名为”2name“则是错误

  • 在bash中,变量的默认类型都是字符串类型,如要进行数值运算,则必修改指定变量类型为数值类型

  • 变量用等号连接值,等号左右两侧不能有空格

  • 变量的值如果有空格,则需使用单引号或双引号包括

  • 在变量值中,可以使用”“转义符

  • 如果需要增加变量的值,那么可以进行变量值的叠加。但需要用双引号包括”$变量名“或${ 变量名}。

  • 如果是把命令的结果作为变量值,则需要使用反引号或$()包括命令

  • 环境变量名建议大写,以便于区分

  1. 变量分类:
  • 用户自定义变量

  • 环境变量:主要保存的是和系统操作环境相关的数据

  • 位置参数变量:主要用来向脚本中传递参数或数据,变量名不能自定义,变量作用是固定的

  • 预定义变量:是bash中已经定义号的变量,变量名不能自定义,变量作用也是固定的

  1. 本地变量:

    • 变量定义:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [ root@localhost ~ ] $ name="yi yang"  
    --变量叠加:

    [ root@localhost ~ ] $ aa=123

    [ root@localhost ~ ] $ aa="$aa"456

    [ root@localhost ~ ] $ aa=${aa}789

    结果:123456789
    • 变量调用:
    1
    [ root@localhost ~ ] $ echo $name
    • 变量查看:
    1
    [ root@localhost ~ ] $ set
    • 变量删除:
    1
    [ root@localhost ~ ] $ unser 变量名



环境变量:(路径:~/.bash_profile)

  • 环境变量概述:

    用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和这个shell的所有子shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效。

  • 设置环境变量:

    • 命令详细:

      1
      2
      3
      4
      5
      6
      [ root@localhost ~ ] $ export 变量名=变量值 
      //申明变量

      [ root@localhost ~ ] $ env //查询变量

      [ root@localhost ~ ] $ unset 变量名 删除变量
  • 系统常见环境变量:

    • PATH:系统查找命令路径

      1
      [ root@localhost ~ ] $ echo $PATH
    • PATH变量叠加:

      1
      [ root@localhost ~ ] $ PATH="$PATH":/root/sh
    • PSI:定义系统提示符的变量

提示符变量
\d: 显示日期,格式”星期 月 日“
\h: 显示简写主机名,如默认主机名”localhost“
\t: 显示24小时制时间,格式”HH:MM:SS“
\T: 显示12小时制时间,格式”星期 月 日“
\A: 显示24小时制时间,格式”HH:MM“
\u: 显示当前用户名
\w: 显示当前所在目录的完整名称
\W: 显示当前所在目录的最后一个目录
\#: 执行的第几个命令
\$: 提示符,如果是root用户会显示提示符为”#“,如果是普通用户会显示提示符为”$“

示例:

1
2
3
4
5
[ root@localhost ~ ] $ PSI='[u@t w]$'

[ root@04:50:08 /usr/local/src ] $ PSI='[u@@ h # W]$'

[ root@04:53 上午 localhost 31 src ] $ PSI='[u@h W]$'



位置参数变量

位置参数变量 作用
$n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}.
$* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数

示例<1>:#!/bin/bash

1
2
3
4
5
6
7
num1=$1

num2=$2

sum=$(($num1 + $num2)) ---变量sum的和是num1加num2

echo $sum ---打印变量sum的值
1
2
3
4
5
6
7
示例<2>:#!/bin/bash

echo "A todal of $# [parameters" ---使用$#代表所有参数的个数

echo "The parameters is:$*" ---使用$*代表所有的参数

echo "The parameters is:$@" ---使用$@代表所有参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
示例<3> :$* 与 $@ 的区别

#!/bin/bash

for i in "$*" ---$*中的所有参数都看成一个整体,所以这个 for 循环只循环一次

do

echo "The parameters is:$i"

done

x=1

for y in "$@" ---$@中的所有参数都看成独立的,所以”$@“中有几个参数,就会循环几次

do

echo "The parameters is:$y"

x=$(($x+1))

done



预定义定量

预定义定量 作用
$? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)

示例:<如图>

  1. 接收键盘输入:
1
2
3
4
5
6
7
8
9
10
[ root@localhost ~ ] $ read [ 选项 ] 变量名

选项:
-p "提示信息" ---在等待read输入时,输出提示信息

-t 秒数 ---read命令一直等待用户的输入,使用此选项可以指定等待时间

-n 字符数 ---read命令只接受指定的字符数,就会执行

-s ---隐藏输入的数据,适用于机密信息的输入

示例<如图>




Bash的运算符


数值运算与运算符

  1. declare声明变量类型

1
2
3
4
5
6
7
8
9
10
11
12
[ root@localhost ~ ] $ declare [ +- ] [ 选项 ] 变量名

选项:
- ---给变量名设定属性

+ ---取消变量的类型属性

-i ---将变量声明为整数型(integer)

-x ---将变量声明为环境变量

-p ---显示指定变量的被声明的类型
  1. 数值运算

  • 方法一:declare
1
2
3
4
5
[ root@localhost ~ ] $ aa=11 --给变量aa赋值

[ root@localhost ~ ] $ bb=33 --给变量bb赋值

[ root@localhost ~ ] $ declare -i cc=$aa+$bb
  • 方法二:exprlet数值运算工具
1
2
3
4
5
6
[ root@localhost ~ ] $ aa=11 --给变量aa赋值

[ root@localhost ~ ] $ bb=33 --给变量bb赋值

[ root@localhost ~ ] $ dd=$(expr $aa + $bb)
// dd的值是aa和bb的和。注意+号两边必须有空格
  • 方法三:$((运算式)) 或$[ 运算式 ]
1
2
3
4
5
6
7
[ root@localhost ~ ] $ aa=11 给变量aa赋值

[ root@localhost ~ ] $ bb=33 给变量bb赋值

[ root@localhost ~ ] $ ff=$(( $aa+$bb ))

[ root@localhost ~ ] $ gg=$[ $aa+$bb ]
  1. 运算符

数字越大运算优先级越高

优先级 运算符 说明
13 -+ 单目负,单目正
12 !~ 逻辑非、按位取反或补码
11 */% 乘、除、取模
10 +- 加、减
9 <<>> 按位左移、按位右移
8 <=>=<> 小于或等于、大于或等于、小于、大于
7 ==!= 等于、不等于
6 & 按位“与”
5 ^ 按位异“或”
4 | 按位“或”
3 && 逻辑“与”
2 || 逻辑“或”
1 =+=-=*=/=%=&=,……=|=<<=>>= 赋值、运算且赋值

示例:

1
2
3
4
5
6
7
8
[ root@localhost ~ ] $ aa=$(( (11+3)*3/2 )) 
//虽乘除的优先级高于加,可以用小括号调整运算优先级

[ root@localhost ~ ] $ bb=$(( 14/3 ))
//14不能被3整除,余数为2

[ root@localhost ~ ] $ cc=$(( 1 && 0 ))
//逻辑运算与,只有两边都是1,结果才是1,否则为0


变量测试与内容替换

变量置换方式 变量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?新值 } 新值输出到标准错误输出(屏幕显示) x为空 x=$y
x=${ y:?新值 } 新值输出到标准错误输出(屏幕显示) 新值输出到标准错误输出(屏幕显示) x=$y
  • 示例一:测试x=${ y-新值 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[ root@localhost ~ ] $ unset y --删除变量

[ root@localhost ~ ] $ x=${ y-lsp } --进行测试

[ root@localhost ~ ] $ echo $x
//因为变量y不存在,所以得到结果为 “x=lsp”
//
//
//
[ root@localhost ~ ] $ y=“” --给y变量赋值为空

[ root@localhost ~ ] $ x=${ y-lsp } --进行测试

[ root@localhost ~ ] $ echo $x
//因为变量y为空,所以得到结果为 x为空
//
//
//
[ root@localhost ~ ] $ y=wslsp --给y变量赋值为 wslsp

[ root@localhost ~ ] $ x=${ y-lsp } --进行测试

[ root@localhost ~ ] $ echo $x
//因为变量y为wslsp,所以得到结果为 x=wslsp



环境变量配置文件


环境变量配置文件简介

环境变量

定义每个用户的操作环境

环境变量配置文件中主要是定义对系统操作环境生效的系统默认环境变量,如PATH等;PATH、HISTSIZE、PS1、HOSTNAME等环境变量写入对应的环境变量配置文件;

常见的环境变量

  1. /etc/profile

  2. /etc/profile.d/*.sh

  3. ~/.bash_profile

  4. ~/.bashrc

  5. /etc/bashrc

注:放在家目录(3,4)下的环境变量配置文件,只会对当前用户起作用;在/etc下的环境变量所有的用户都起作用;

  1. source命令:
1
2
3
[ root@localhost ~ ] $ source 配置文件

[ root@localhost ~ ] $ . /配置文件
  1. 环境变量配置文件调用顺序:

  1. /etc/profile的作用:

    1. USER变量:

    2. LOGNAME变量:

    3. MAIL变量:

    4. PATH变量:

    5. HOSTNAME变量:

    6. HISTSIZE变量:

    7. umask:

    8. 调用/etc/profile.d/*.sh文件


  1. umask #查看系统默认权限

    1. 文件最高权限为666

    2. 目录最好权限为777

    3. 权限不能使用数字进行换算,而必须使用字母;使用的是最高权限丢点默认的权限;

      Eg:当前默认权限为022,那么创建的文件权限就是最高权限减去默认权限:wr-wr-wr- 减去 —-w–w- 那么创建的文件权限默认为wr–r–r-

    4. Umask定义的权限,是系统默认权限中准备丢弃的权限如022,也就是—-w—w-

  2. ~/.bash_profile的作用:

    1. 调用了~/.bashrc 文件

    2. 在PATH变量后面加入了”:$HOME/bin”这个目录

  3. ~/.bashrc的作用:

    1. 定义默认别名

    2. 调用/etc/bashrc

  4. /etc/bashrc的作用:

    1. PS1 变量

    2. umask

    3. PATH变量

    4. 调用/etc/profile.d/*.sh文件



其他配置文件和登录信息

  1. 注销时生效的环境变量配置文件:

    1. ~/.bash_logout
  2. 其他配置文件:

    1. ~/bash_history
  3. shell登录信息:

转义符 作用
d 显示当前系统日期
s 显示操作系统名称
l 显示登录的终端号(常用)
m 显示硬件体系结构,如i386等
n 显示主机名
o 显示域名
r 显示内核版本
t 显示当前系统时间
u 显示当前登录用户的系列号
  • 远程终端欢迎信息:/etc/issue.net

    • 转义符在/etc/issue.net文件中不能使用

    • 是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入“Banner/etc/issue.net” 才能显示 (记得重启SSH服务)

  • 登录之后欢迎信息:/etc/motd

    • 不管是本地登录还是远程登录,都可以显示此欢迎信息