本文共 6500 字,大约阅读时间需要 21 分钟。
什么是shell
Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。
shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。
shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。
Linux中的shell有多种类型,其中最常用的几种是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。
三种shell各有优缺点。Bourne shell是UNⅨ最初使用的shell,并且在每种UNⅨ上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。
Linux操作系统缺省的shell是Bourne Again shell,它是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。
bash shell 是 Linux 的默认 shell
Bash sheel 执行命令
命令 选项 参数 shell每个基本的构成元素之间都相隔一个空格。
[root@Redhat7 ~]# ls -a /tmp/ 多个参数可以写在一起
[root@Redhat7 ~]# echo $SHELL
/bin/bash
[root@Redhat7 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
Bash sheel 输入命令或者参数的前几个,按tab就可以补全。
使用最多的就是
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
命令别名将⽤户经常使⽤的复杂命令简单化, 可以⽤ "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个人用户环境变量
全局环境变量和个人用户环境变量=全局等于妈妈让你去相亲,个人最后做决定的还是你。
内部命令: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 会在这些路径中进⾏逐个扫描。
个人环境变量修改
[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
//PATH由多个路径组成,每个路径值之间⽤冒号间隔,对这些路径的增加和删除操作都将影响到Bash解释器对Linux命令的查找。
全局环境变量修改//修改PATH变量
[root@xuliangwei ~]# PATH=/soft/bin:$PATH //写⼊/etc/profile配置⽂件永久⽣效 echo 'export PATH=/soft/bin:$PATH' >> /etc/profile
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
[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"
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
* 代表匹配任意长度的字符
? 代表匹配任意单个字符
[ ] 代表指定范围的单子字符
;; 前面命令是否执行完成都会执行后面命令
&& 在前一个命令结束时,若返回值为 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
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
转载地址:http://ktbai.baihongyu.com/