linux系统管理—第五章 Linux-bashshell

                                  linux系统管理—第五章

                                      Linux-bashshell

概述

 

 

什么是shell

Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。

shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。

shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。

 

Linux中的shell有多种类型,其中最常用的几种是Bourne shellsh)、C shellcsh)和Korn shellksh)。

三种shell各有优缺点。Bourne shellUN最初使用的shell,并且在每种UN上都可以使用。Bourne shellshell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell

Linux操作系统缺省的shellBourne Again shell,它是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shellKorn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面

bash shell 是 Linux 的默认 shell

5.1 bash shell教程

5.1.1 SHEEL语法

Bash sheel 执行命令

命令 选项 参数 shell每个基本的构成元素之间都相隔一个空格。

[root@Redhat7 ~]# ls -a /tmp/ 多个参数可以写在一起

 

5.1.2 查看当前使用的shell

[root@Redhat7 ~]# echo $SHELL

/bin/bash

5.1.3 查看系统可用的SHELL

[root@Redhat7 ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/usr/bin/sh

/usr/bin/bash

/usr/sbin/nologin

/bin/tcsh

/bin/csh

5.1.4 bash 特性补全

Bash sheel 输入命令或者参数的前几个,按tab就可以补全。

5.1.5 Bash特性:命令快捷键

 

使用最多的就是

Ctrl+c 终止前台任务

Ctrl+l 清屏 和clear等效

Ctrl+a 光标跳转到首行

Ctrl+e 光标跳转到末尾

History 查看系统命令历史

-w 保存命令历史到历史文件

-c 清空命令历史

-d 删除命令历史的第N行

 

[root@Redhat7 ~]# history

  342  ls /etc/sysconfig/network-scripts/ifcfg-eno16777736

  343  cat /etc/sysconfig/network-scripts/ifcfg-eno16777736

  344  ls /etc/sysconfig/network-scripts/ifcfg-eno16777736

!行号,执行固定行的命令

[root@Redhat7 ~]# !344

ls /etc/sysconfig/network-scripts/ifcfg-eno16777736

/etc/sysconfig/network-scripts/ifcfg-eno16777736

!命令,执行最近命令

[root@Redhat7 ~]# !ls

ls /etc/sysconfig/network-scripts/ifcfg-eno16777736

/etc/sysconfig/network-scripts/ifcfg-eno16777736

5.1.6 bash特性-别名

命令别名将⽤户经常使⽤的复杂命令简单化, 可以⽤ "alias 别名名称=命令" 命令创建属于⾃⼰的
命令别名, 若要取消⼀个命令别名,则是⽤ unalias 别名名称 命令。

 

//1.定义临时别名, if1为查看eth0⽹卡别名
[root@xuliangwei ~]# alias if0='ifconfig eth0'
[root@xuliangwei ~]# if0

 

//2.定义系统永久⽣效别名, 将命令别名添加⾄当前⽤户环境配置⽂件
[root@xuliangwei ~]# echo "alias ifconfig='ifconfig eth0'" >> ~/.bashrc
//如将别名命令添加⾄/etc/bashrc , 对所有⽤户⽣效
//3.取消临时别名
[root@xuliangwei ~]# unalias ifconfig

 

/etc/bashrc 全局环境变量

家目录 .bashrc个人用户环境变量

全局环境变量和个人用户环境变量=全局等于妈妈让你去相亲,个人最后做决定的还是你。

5.1.7 Bash:命令的执行流程

内部命令:shell程序自带的命令。

外部命令:在系统PATH变量的某个路径下的可执行程序。

当我们执⾏⼀个命令, 整个命令执⾏流程如下:

1.判断命令是否通过绝对路径执⾏

2.判断命令是否存在别名

3.判断⽤户输⼊的是内部命令还是外部命令

4.内部命令直接执⾏, 外部命令检测是否存在缓存

5.检测 PATH 路径, 有执⾏, ⽆报错

Type 检测命令类型

[root@Redhat7 ~]# type -a cd

cd 是 shell 内嵌

cd 是 /usr/bin/cd

 

[root@jsmongodb ~]# type -a mongod

mongod 是 /app/mongodb3.0/bin/mongod

PATH 变量定义的路径, 作⽤是告诉 Bash 执⾏的外部命令存放的位置, Bash 会在这些路径中进⾏逐个扫描。

1 修改命令个人环境变量

个人环境变量修改

[root@jsmongodb ~]# cat .bash_profile

# .bash_profile

 

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

        . ~/.bashrc

fi

 

# User specific environment and startup programs

 

PATH=$PATH:$HOME/bin

 

export PATH

MONGODB_HOME=/app/mongodb3.0

export MONGODB_HOME

 

PATH=$MONGODB_HOME/bin:$PATH

export PATH

 

 

[root@jsmongodb ~]# echo $PATH

/app/mongodb3.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

2 修改全局命令环境变量

//PATH由多个路径组成,每个路径值之间⽤冒号间隔,对这些路径的增加和删除操作都将影响到Bash解释器对Linux命令的查找。
全局环境变量修改

//修改PATH变量
[root@xuliangwei ~]# PATH=/soft/bin:$PATH
//写⼊/etc/profile配置⽂件永久⽣效
echo 'export PATH=/soft/bin:$PATH' >> /etc/profile

5.1.8 Bash 特性 路径展开

 

Linux Shell 下路径展开⽤花括号包括, 逗号分隔, 这样花括号⾥的内容会被展开形成列表。

 

[root@Redhat7 ~]# rm -rf /tmp/{zz,yy}

 

[root@Redhat7 ~]# mkdir /tmp/zz/a/b /tmp/yy/a/b -pv

mkdir: 已创建目录 "/tmp/zz"

mkdir: 已创建目录 "/tmp/zz/a"

mkdir: 已创建目录 "/tmp/zz/a/b"

mkdir: 已创建目录 "/tmp/yy"

mkdir: 已创建目录 "/tmp/yy/a"

mkdir: 已创建目录 "/tmp/yy/a/b"

 

 

[root@Redhat7 ~]# mkdir /tmp/{zz,yy}/a/b –pv

1 . .特性

[root@Redhat7 ~]# echo {1.55}

{1.55}

[root@Redhat7 ~]# echo {1..55}

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

 . .后续是至的意思。

[root@Redhat7 ~]# mkdir -pv /iso7.2/syjhct/iso2019{1..12}

mkdir: 已创建目录 "/iso7.2/syjhct"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20191"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20192"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20193"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20194"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20195"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20196"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20197"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20198"

mkdir: 已创建目录 "/iso7.2/syjhct/iso20199"

mkdir: 已创建目录 "/iso7.2/syjhct/iso201910"

mkdir: 已创建目录 "/iso7.2/syjhct/iso201911"

mkdir: 已创建目录 "/iso7.2/syjhct/iso201912"

 

5.1.9 shell元字符

 

 

shell 除了有通配符之外,由shell 负责预先先解析后,将处理结果传给命令行之外,shell还有一系列自己的其他特殊字符。

shell元字符

字符

说明

 =

 变量名=值,为变量赋值。注意=左右紧跟变量名和值,中间不要有空格

 $

 变量值替换,$变量名替换为shell变量的值;

 >

 prog > file 将标准输出重定向到文件。

 >>

 prog >> file 将标准输出追加到文件。

 <

 prog < file 从文件file中获取标准输入

 |

 管道命令,例:p1 | p2 将p1的标准输出作为p2的标准输入

 &

 后台运行命令,最大好处是无需等待命令执行结束,就可以在同一命令行下继续输入命令

 ()

 在子shell中执行命令

 {}

 在当前shell中执行命令,或用在变量替换的界定范围(例如上面的${变量名}用法)。

 ;

 命令结束符。例如p1;p2表示先执行p1,再执行p2

 && 等同 and

在前一个命令结束时,若返回值为 true,继续执行下一个命令。

 || 等同 or

在前一个命令结束时,若返回值为 false,继续执行下一个命令。

 !

 执行历史记录中的命令

 ~

 home目录

 

特殊符号(#)

注释符号(Hashmark[Comments])

1.在shell文件的行首,作为shebang标记,#!/bin/bash;

2. 其他地方作为注释使用,在一行中,#后面的内容并不会被执行,除非;

3. 但是用单/双引号包围时,#作为#号字符本身,不具有注释作用。

特殊符号(.)

点号(dot command [period])。

1. 相当于bash内建命令source,如:

#!/bin/bash

./mongod

 

5.1.10 shell 通配符

* 代表匹配任意长度的字符

? 代表匹配任意单个字符

[ ]  代表指定范围的单子字符

;; 前面命令是否执行完成都会执行后面命令

&& 在前一个命令结束时,若返回值为 true,继续执行下一个命令。 *

||    在前一个命令结束时,若返回值为 false,继续执行下一个命令。 *

 

 

[list]      匹配list中的任意单一字符  a[xyz]b  a与b之间有且只有一个字符, 且只能是x或y或z, 如: axb, ayb, azb。

 [!list]    匹配除list中的任意单一字符     a[!0-9]b  a与b之间有且只有一个字符, 但不能是数字, 如axb, aab, a-b等

 [c1-c2]        匹配c1-c2中的任意单一字符     a[0-9]b  a与b之间有且只有一个字符,该字符是0-9之间的数字,如a0b, a1b,... ,a9b。

[root@Redhat7 ~]# touch /syjjjj/{xz,xy,yz}

[root@Redhat7 ~]# ls /syjjjj/            

x  xy  xyz  xz  y  yz  z

[root@Redhat7 ~]# ls /syjjjj/[xyz]

/syjjjj/x  /syjjjj/y  /syjjjj/z

[root@Redhat7 ~]# ls /syjjjj/[x,z]

/syjjjj/x  /syjjjj/z

[root@Redhat7 ~]# ls /syjjjj/[x-z]

/syjjjj/x  /syjjjj/y  /syjjjj/z

 

 

[root@Redhat7 ~]# ls /iso7.2/Packages/*DB*

/iso7.2/Packages/perl-DBD-MySQL-4.023-5.el7.x86_64.rpm

/iso7.2/Packages/perl-DBD-Pg-2.19.3-4.el7.x86_64.rpm

/iso7.2/Packages/perl-DBD-SQLite-1.39-3.el7.x86_64.rpm

 

5.1.11 Bash特性:转义字符

Shell解释器提供了⾮常丰富的转义字符, 来实现字符处理以及命令替换。

4类常⽤转义字符

反斜杠(\):使反斜杠后⾯的⼀个变量变为字符串。

单引号(''):转义其中所有的变量为单纯的字符串。

双引号(""):保留其中的变量属性,不进⾏转义处理。

反引号(``):基本不用,把其中的命令执⾏后返回结果。不好用,一般使用$(命令)

[root@Redhat7 ~]# echo the directory is $PWD

the directory is /root

反斜杠(\):使反斜杠后⾯的⼀个变量变为字符串。

 

[root@Redhat7 ~]# echo the directory is \$PWD

the directory is $PWD

 

 

[root@Redhat7 ~]# syj=hct

[root@Redhat7 ~]# echo $syj

hct

[root@Redhat7 ~]# echo \$syj

$syj

[root@Redhat7 ~]# echo $syj+$syj

hct+hct

[root@Redhat7 ~]# echo '$syj+$syj'

$syj+$syj

发布了37 篇原创文章 · 获赞 0 · 访问量 2409

猜你喜欢

转载自blog.csdn.net/syjhct/article/details/100164497