Bash Shell详解

引言:什么是Shell?

Linux的命令行接口归结起来就是各种Shell,那么到底什么是Shell?
Shell,译为外壳,是用户直接连入计算机所使用的计算机程序,负责解析用户提供的命令,如词法分析、语法分析、句法分析。

1.Shell的分类

Linux 的命令 shell 是与操作系统相分离的一层。不同的 shell 环境影响您具备不同的功能,比如可编辑的命令行和历史命令回查等。shell 还决定了脚本中函数的语法。
下面就列举几个常用的Shell:
1.  bash
bash shell 是 Bourne shell 的一个免费版本,它是最早的 Unix shell,包括许多附加的特点。Bash 有可编辑的命令行,可以回查历史命令,支持 tab 键补齐以使用户避免输入长的文件名。
2.  csh
C shell 使用的是“类C”语法,借鉴了 Bourne shell 的许多特点,只是内部 shell 命令集有所不同。
3.  ksh
Korn shell 的语法与 Bourne shell 相同,同时具备了 C shell 的易用特点。许多安装脚本都使用 ksh ,即使您不把它作为您的主 shell,您也应该在系统中安装它。
4.  tcsh 
TC shell 是 C shell 的一个增强版本,与 C shell 完全兼容。
5.  zsh
Z shell 是 Korn shell 的一个增强版本,具备 bash shell 的许多特色。
> 默认的 shell 是每个用户帐号的一个参数。Linux 中典型的默认 shell 是 /bin/bash,不过也可以用其他的 shell。每个 shell 的 man 文档实际上都非常好,都对各种 shell 及其使用进行了详细的说明。

2.Bash Shell的界面和命令处理机制

Bash Shell的命令提示符:
[ username@hostname working_directory ] {#|$}
看起来可能有些乱,下面来具体介绍一下吧。
username: 用户登入Linux系统所使用的用户
hostname: 当前主机的主机名,非完整格式
working_directory :用户当前所在目录,随着用户的目录切换而切换的
‘#’:  管理员账号登陆,为root,拥有最高权限,能执行所有操作;
‘$’:  普通用户,非root用户登录,不具有管理员权限,不能执行系统管理类操作;

shell命令的处理机制
shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当作命令,具体查找顺序如下:
1. 查找内部命令
2. 根据PATH环境变量中设定的目录,自左向右逐个搜索目录下的文件名
> 注意:
为了安全起见,建议使用非管理员账号登陆!执行管理操作时,临时切换至管理员账号,操作完成后即退回。

3.Bash Shell的特性

bash shell有很多的特性,基于这些特性让bash shell变得非常易用。

序号 | 特性
—— | ——
1 | 支持命令历史
2 | 支持管道、重定向
3 | 支持命令别名
4 | 支持命令行编辑
5 | 支持命令行展开
6 | 支持文件名通配(globbing) 
7 | 支持使用变量
8 | 支持编程
9 | 支持命令补全
10 | 支持路径补全
11 | 支持命令别名
12 | 支持命令引用(替换)

4.Bash Shell基础知识

Bash Shell文件名通配符

通配符号 | 含义
———— | ——
* | 可以用于匹配任意长度的任意字符
? | 可以匹配任意单个字符
[] | 可以匹配指定范围内的任意单个字符,例如:[a-zA-Z]*[0-9], 以单个字母开头,以数字结尾的字符串
[^] | 匹配指定范围之外的任意单个字符
还有一些还有一些特殊的通配符,还需要再加上[]才能使用,这些也支持取反格式:[^[]]

通配符号 | 含义
———— | ——
[:space:] | 空白字符
[:punct:] | 标点符号
[:lower:] | 小写字母
[:upper:] | 大写字母
[:alpha:] | 大小写字母
[:digit:] | 数字
[:alnum:] | 数字和大小写字母
> 还有更多的特殊通配符,可以通过man 7 glob来查询帮助

命令补全
在用户输入命令的部分字母后,可以敲击Tab键,通过Bash Shell的命令不全功能,在PATH环境变量中搜索与之前敲击字符相同的命令,并进行自动补全,如果出现多个,再敲击一次Tab,则会以列表形式展现出来。

路径补全
用户可以在输入路径、文件时不必输入路径或文件的全部名称,而是根据给定的起始路径,输入能够唯一代表该路径或文件的部分字符后,通过Tab键进行路径补全,提高输入效率。如果输入的字符不能唯一代表路径或文件,需要再次敲击Tab键,以列表形式列出符合要求的路径或文件。

命令执行的状态结果
Bash Shell通过状态返回值来输出命令的执行结果:
成功:0
失败:1-255
命令执行完成之后,其状态返回值会保存于Bash Shell的特殊变量$?中。
示例:
~]# echo $?
一般在执行完某一个指定命令后执行,来查看命令的执行状态结果。

命令引用(替换)用法 – 把命令中某个子命令替换为其执行结果的过程
命令替换可以使用两种方法:$()或者 `COMMAND`是反引号
示例:
用pwd命令的结果替换:echo "The current directory is $(pwd)"
用date命令的结果替换:touch ./file-$(date +%Y-%m-%d-%H-%M-%S).txt

命令行展开

符号 | 含义
—— | ——
~ | 自动展开为用户的家目录,或指定用户的家目录
{} | 可承载一个以逗号分割的路径列表,并能够将其展开为多个路径

示例:
/tmp/{a,b},相当于/tmp/a和/tmp/b

练习题:
1. 创建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b
~]# mkdir -pv /tmp/x/{y1/{a,b},y2}
2. 创建/tmp/a_c, a_d, b_c, b_d
~]# mkdir -v /tmp/{a,b}_{c,d}
3. 创建如下目录结构:

练习目录结构.png
~]# mkdir -pv /tmp/mylinux/{bin,boot/grub,dev,etc/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local/{bin,sbin},var/{lock,log,run}}

Bash Shell支持的引号

引号类型 | 作用
———— | ——
反引号“或 $() | 命令引用(替换)
双引号”” | 弱引用,可以实现变量替换
单引号‘’ | 强引用,不完成变量替换

命令行编辑中光标跳转快捷键

快捷键 | 作用
——— | ——
Ctrl+a | 跳到命令行首
Ctrl+e | 跳到命令行尾
Ctrl+u | 删除光标至命令行首的内容
Ctrl+k | 删除光标至命令行尾的内容
Ctrl+l | 清屏

系统输入输出设备

设备类型 | 表现形式 | 代码 | 具体设备
———— | ———— | —— | ————
标准输入 | STDIN | 0 | 键盘
标准输出 | STDOUT | 1 | 显示器
标准错误输出 | STDERR | 2 | 显示器

I/O重定向
定义:将默认输入输出设备改变成指定的输入输出设备上的过程

符号 | 作用
—— | ——
> | 标准输出重定向,覆盖输出
>> | 标准输出重定向,追加输出
2> | 错误输出重定向,将错误输出至设备,覆盖输出
2>> | 错误输出重定向,将错误输出至设备,追加输出
&> | 重定向标准输出和错误输出至同一个文件,覆盖输出
< | 标准输入重定向,覆盖输入
<< | 标准输入重定向,输入多行。
示例1:
<br />
~]# cat &lt;&lt; EOF<br />
&gt; hello<br />
&gt; I am leo<br />
&gt; EOF<br />
hello<br />
I am leo<br />

示例2:
<br />
~]# cat &gt;&gt; /tmp/a.txt &lt;&lt; EOF<br />
&gt; 123<br />
&gt; 456<br />
&gt; 789<br />
&gt; EOF<br />
~]# cat /tmp/a.txt<br />
123<br />
456<br />
789<br />

> 可以通过set命令禁止对已存在的文件使用覆盖重定向。
set -C: 禁止对已存在文件使用覆盖重定向
如果仍然想强制覆盖输出,则使用>|代替>即可。
set +C:关闭禁用使用覆盖重定向的功能

管道
定义:把前一个命令的输出,作为后一个命令的输入
命令格式:命令1 | 命令2 | 命令3 | …
示例1:
echo "hello, world." | tr 'a-z''A-Z'
将hello,world.字符全部变成大写。

示例2:
echo "redhat" | passwd --stdin hive
将hive的密码改为redhat

示例3:
cut -d: -f3 /etc/passwd | sort -n
将/etc/passwd文件中以:为分隔符的第三个字段(UID)按数值升序排列

原创文章,作者:N27_sapbcs,如若转载,请注明出处:http://www.178linux.com/86377

(1)
N27_sapbcsN27_sapbcs
上一篇 2017-09-07 16:02
下一篇 2017-09-07 16:05

相关推荐

  • 马哥教育网络20期+第六周课程练习

    请详细总结vim编辑器的使用并完成以下练习题 1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; :%s/^[[:space:]]/#&/ 2、复制/boot/grub/grub.conf至/tmp目录中,删除/tmp/grub.conf文件中的行首的空白…

    Linux干货 2016-07-07
  • alias——Linux基本命令(4)

    1.     alias别名 (1)查看、设置别名 Linux系统提供了一个有用的工具叫alias,可以让我们将一些需要频繁使用的但又过于冗长的命令设置一个别名,这样一来,以后只需输入一个简短的别名就可以达到同样的作用。 alias显看当前已定义的别名   使用aliasaliname=’comm…

    2017-07-13
  • mv命令总结

    mv命令是move的缩写,可以用来移动文件或者将文件改名,是Linux系统下常用的命令,经常用来备份文件或者目录。 命令格式:mv  源文件或目录 目标文件或目录 2.命令功能:视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能…

    2017-07-24
  • 文件查找命令find

      在文件系统上常常需要根据文件的各种属性去查找符合条件的文件。在Linux下也有相当优异的查找命令。今天只要将find和locate。find通常不常用,因为速度慢!通常我们先使用locate来进行模糊查找,如果真找不到了,才以find来查找。为什么呢?因为locate是利用数据库来查找数据,所以速度非常快,而且并没有实际查询硬盘比较省时间。 l…

    Linux干货 2016-08-22
  • 博客开始的地方

    来北京挺长时间了,一直都在瞎忙,特别想找个地逛逛,约朋友一起去,结果人家只喜欢吃饭,逛街,来北京瞎逛过两次,第一次是面试路过潘家园,然后进去逛了半天,看各种各样的老古董,当然最多的还是手串,那种核桃,当然还是看到了好多好多有意思的东西,比如下面的小和尚和老和尚,小和尚光着头感觉特别可爱,老和尚还卖萌, 当然还有下面这个关老爷,他的肚子为什么被雕刻的那么大,难…

    2018-03-26
  • 26期全程班-第一周博客作业

    1、描述计算机的组成与功能。 计算机由以下五大单元组成: 一:CPU的算法计算和逻辑判断单元; 二:CPU的控制单元;协调各设备协同工作。 三:内存:RAM(random accace memory)随机读取内存;数据处理的必经路段。 四:输入设备:键盘、鼠标等;负责数据的输入。 五:输出设备:屏幕、终端、文件、硬盘等;负责数据的输出 2、按系列罗列Linu…

    Linux干货 2016-12-30

评论列表(1条)

  • 马哥教育
    马哥教育 2017-10-10 12:58

    这篇博客已经超越了大部分了同学。