Linux Shell概述和Bash基本功能

1. Shell概述

 1.1 概念

这里可以分两个方面来理解:

  • 是一个命令行解释器。它为用户提供了一个像Linux内核发送请求以便运行程序的界面系统程序,用户可以通过shell来启动、挂起、停止甚至是编写一些程序。
  • shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

 1.2 Shell 分类

  • Bourne shell:从1979起Unix就开始使用 Bourne Shell,Bourne Shell的主文件名为 sh。
  • C Shell: C Shell主要在BSD版的Unix系 统中使用,其语法和C语言相类似而得名。
  • Shell的两种主要语法类型有Bourne和C, 这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主 要包括:csh、tcsh
  • Bash: Bash与sh兼容,是Linux系统默认使用的Shell。

其实可以这样理解:Shell是一种编程语言,而Bash是它的语法。

 1.3 查看你的Linux所支持的Shell

[cfp@bogon ~]$ cat /etc/shells

2. Shell脚本的执行方式

 2.1 echo命令

echo输出命令:
       -e 支持反斜线控制字符转换

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

实例

[root@bogon ~]$ echo -e "ab\bc"
ac
[root@bogon ~]$ echo -e "a\tb\tc\nd\te\tf"
a	b	c
d	e	f
[root@bogon ~]$ echo -e "\e[1;31m abcd \e[0m"
 abcd    #这是红色的!
 #30m=黑色,31m=红色,32m=绿色,33m=黄色
 #34m=蓝色,35m=洋红,36m=青色,37m=白色

 2.2 第一个脚本的完整代码

第一个脚本的完整代码:输出hello world

#!/bin/bash

  这里要说明以下,编写Shell脚本的时候,上面这句代码是放在脚本开头的,它不是一句注释,而是用这个语句来标识以下输入都是shell脚本。

[root@bogon ~]$ mkdir /tmp/sh   #创建一个sh目录
[root@bogon ~]$ touch /tmp/sh/hello.sh  #在sh目录目录下创建一个hello.sh文件
[root@bogon ~]$ vi /tmp/sh/hello.sh   #编辑这个文件
#!/bin/bash        
#name Mrs Chen     #这一行是注释
#Data 2020/3/1		#这一行是注释
echo "hello world"   #输出hello world
[root@bogon ~]$ bash /tmp/sh/hello.sh
hello world

 2.3 脚本执行的方式

脚本的执行一般有两种方式:
(1) 赋予执行权限,直接运行。分两步:

  • chmod 755 文件名
  • 文件绝对路径或相对路径
[root@bogon ~]$ chmod 755 /tmp/sh/hello.sh
[root@bogon ~]$ /tmp/sh/hello.sh
hello world

(2) 通过bash调用执行脚本:

  • bash 文件绝对路径或相对路径
[root@bogon ~]$ bash /tmp/sh/hello.sh
hello world

3.Bash的基本功能

 3.1 历史命令

语法: history [选项] [历史命令保存文件]
选项:
   -c 清空历史命令
   -w 把缓存中的历史命令写入历史命令保存文件.bash_history (在家目录下)。 ”.“ 表示该文件是隐藏文件
范例:[root@bogon ~]$ history

历史命令默认会保存1000条,可以在环境配置文件/etc/profile中进行修改:找到“HISTSIZE=1000“这句代码,将数字修改就行。

历史命令的调用:

  • 使用上下、箭头调用以前的历史命令(最常用的方法)
  • 使用“!n”重复执行第n条命令,n是用history查询到的。
  • 使用“!!”重复执行上一条命令
  • 使用"!字串"重复执行最后一条以该字符串开头的命令

 3.2 命令与文件的补全

  在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文时,按“Tab”键就会自动补全。
  但这里要注意的是,如果有多条命令与你所打的相符合,按一下”Tab“键没用。按两下”Tab“,可以查看与你所打相符合的所有命令,然后自己再选择。

 3.3 Bash常用快捷键与命令别名

Bash常用快捷键

快捷键 作用
ctrl+a 把光标移动到命令行开头
ctrl+e 把光标移动到命令行结尾
ctrl+c 强制终止当前命令
ctrl+l 清屏,相当于clear命令
ctrl+u 删除或剪切光标之前的命令
ctrl+k 删除或剪切光标之后的命令
ctrl+y 粘贴ctrl+u或ctrl+k剪切的内容
ctrl+r 在历史命令中搜索,按下ctrl+r之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索
ctrl+d 退出当前终端

命令别名:
  命令别名指的是,如过A命令很长、很难记住或者很难打,就把这个命令制作一个别名,以后就使用这个别名来代替A命令。下面是制作方法:

[root@bogon ~]$ alias 别名=‘原命令’   #设定命令别名
[root@bogon ~]$ alias   #查询命令别名
[root@bogon ~]$ unalias 别名   #删除别名

  按照如上步骤,仅仅是在终端没被关闭之前有效。一旦终端关闭后,上边的操作都会无效。将设定命令别名的这个命令,加入到这个文件中, 让别名永久生效. bashrc是家目录下面的文件,是一个隐藏文件。

[root@bogon ~]$ vi  .bashrc
# .bashrc
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

  PS:设定别名的时候,一定要注意!你要确定别名和系统自带的一些命令不会重叠!!

 3.4 输入输出重定向

设备 设备文件名 文件描述符 类型
键盘 /dev/sdtin 0 标准输入
显示器 /dev/sdtout 1 标准输出
显示器 /dev/sdterr 2 标准错误输出

  输出重定向,就是将本该输出在显示器上的内容,重定向输出到文件中。输出重定向很常见,是Linux里面很重要的一个命令。

标准输出重定向

符号 作用
命令 > 文件 以覆盖的方式,把命令的正确输出输出到指定文件或设备当中
命令 >> 文件 以追加的方式,把命令的正确输出输出到指定文件或设备当中

标准错误输出重定向

符号 作用
错误命令 2> 文件 以覆盖的方式,把命令的错误输出输出到指定文件或设备当中
错误命令 2>> 文件 以追加的方式,把命令的错误输出输出到指定文件或设备当中

  一般上边两种不常用。因为如果可以已经知道命令是错误的,改正不就行了?所以就有了下面这个最常用的

正确输出和错误输出同时保存

符号 作用
命令 &>文件 以覆盖的方式,把命令的正确输出、错误输出输出到指定文件或设备当中 (注意,最后一个“文件”前面没有空格!!)
命令 &>>文件 以追加的方式,把命令的正确输出、错误输出输出到指定文件或设备当中 (注意,最后一个“文件”前面没有空格!!)
命令 >> 文件1 2>>文件2 把正确的的输出追加到文件1中,把错误的输出追加到文件2中 (注意,最后一个“文件”前面没有空格!!)

实例讲解:

[root@bogon ~]$ ls .user &>./text/a.txt    #将命令ls .user的结果输出到文件./text/a.txt中
[root@bogon ~]$ cat ./text/a.txt    #查看./text/a.txt文件
ls: cannot access '.user': No such file or directory

  输入重定向,就是将文件中的内容作为输入,不再用键盘输入。输入重定向在Linux中基本用不到,了解这个概念就行,主要会使用输出重定向即可。

 3.5 多命令顺序执行与管道符

(1)多命令执行顺序:

多命令执行符 格式 作用
; 命令1 ; 命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1 && 命令2 逻辑与,当命令1正确执行,则命令2才会执行。
|| 命令1 || 命令2 逻辑或,当命令1执行不正确,则命令2才会执行

实例讲解:

[root@bogon ~]$ ls ; cd /user ; date
Desktop  Documents  Downloads  Music  Pictures  Public  Videos
bash: cd: /user: No such file or directory
Mon 02 Mar 2020 04:50:51 PM CST
#第二行的内容打印的是第一个命令“ls”。第三行的内容是打印第二个命令“cd/user”。
#第四行的内容是打印第三个命令“date”。
[root@bogon ~]$ date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
#将/dev/zero中的内容写入到文件/root/testfile下面,写入98M大小的数据。

dd 命令
功能描述:复制文件并对原文件内容进行转换和格式化处理
语法:dd if=输入文件 of=输出文件 bs=字节数 count=个数
 选项:
  if=输入文件  指定源文件或源设备
  of=输出文件  指定目标文件或目标设备
  bs=字节数   指定一次输入/输出多少个字节,即把这些字节看做一个数据块
  count=个数   指定输入/输出多少个数据块
范例:$ date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date

(2)管道符:
命令格式:[root@bogon ~]$ 命令1 | 命令2
功能描述:命令1的正确输出作为命令2的执行对象

[root@bogon ~]$ ll -a /etc/ |more   #将命令ll -a /etc/的输出按页显示
[root@bogon ~]$ netstat -an |grep "ESTABLISHED" #在netstst -an命令的输出中查找字符串“ESTABLISHED“

grep命令:
功能描述:一个强大的文本搜索工具
语法:grep [选项] “搜索内容” 文件名
选项:
  -i:忽略大小写
  -n: 输出行号
  -v: 反向查找
  --color=auto 搜索出的关键字用颜色显示
范例:$ grep -n "root" /etc/passwd

 3.6 通配符与其他特殊符号

  Linux中通配符是用来匹配文件名的。通配符的含义和正则表达式的含义比较像,但是有区别。Linux中常见的通配符如下:

通配符 作用
? 匹配一个任意字符
* 匹配0个或任意多个任意字符,也就是可以匹配任何内容
[ ] 匹配括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c
[ - ] 匹配括号中任意一个字符,- 代表一个范围,例如:[a-z]代表匹配一个小写字母
[ ^ ] 逻辑非,表示匹配不是括号内的一个字符。例如:[^0-9]代表匹配一个不是数字的字符

通配符的实例如下:

[cfp@bogon ~]$ touch abc   #在家目录下创建一个abc文件
[cfp@bogon ~]$ touch abcd    #在家目录下创建一个abcd文件
[cfp@bogon ~]$ touch 012
[cfp@bogon ~]$ touch 0abc
[cfp@bogon ~]$ ls ?abc    #在家目录下搜索一个文件名为:任一字符+abc 的文件
0abc
[cfp@bogon ~]$ ls [0-9]*
012  0abc
[cfp@bogon ~]$ ls *abc
0abc  aabc  abc

  Bash中其他特殊符号

符号 作用
‘ ’ 单引号。在单引号中所有的特殊符号,如“$”和"`"(反引号)都没有特殊含义
" " 双引号。在双引号中特殊符号都没有特殊含义,但是“$”、"`"、"\"是例外,拥有“调用变量的值”、“引用命令”、“转义符”的特殊含义
`` 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和 ( ) ()作用一样,不过推荐 (),因为反引号非常容易看错
$() 和反引号一样,用来引用系统命令
# 在Shell脚本中,#开头的行代表注释
$ 用于调用变量的值,如果需要调用变量name的值时,需要用$name的方式得到变量的值
\ 转义符,跟在\之后的特殊符号将失去特殊符号含义,变为普通字符

特殊符号的 实例如下(按着例子来理解特殊符号的含义):
[cfp@bogon ~]$ name=sc   
[cfp@bogon ~]$ echo name
name
[cfp@bogon ~]$ echo $name
sc
[cfp@bogon ~]$ echo $(date)
Tue 03 Mar 2020 03:43:30 PM CST
[cfp@bogon ~]$ echo date
date
[cfp@bogon ~]$ echo "$(date)"  #双引号
Tue 03 Mar 2020 03:45:00 PM CST
[cfp@bogon ~]$ echo '$(date)'  #单引号
$(date)
[cfp@bogon ~]$ echo `date`    #反引号
Tue 03 Mar 2020 03:43:53 PM CST

4.总结

  文章简单介绍了Shell的概念以及一些常见的用法。原理+实例,让读者能更容易理解,更容易记住。本篇文章只是Shell的起步文章,后面会接着更新Shell编程和其他的一些Shell基础性内容。

发布了36 篇原创文章 · 获赞 65 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43275558/article/details/104593527
今日推荐