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
2.4 Linux和Windows下的shell
Windows下编译的shell在Linux环境下可能不支持,可以使用如下命令来转换:
[root@bogon ~]$ dos2unix 文件名 #unix2dos,linux环境转Windows
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中基本用不到,了解这个概念就行,主要会使用输出重定向即可。
[root@bogon ~]$ wc [选项][文件名]
-c 统计字节数
-w 统计单词数
-l 统计行数
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基础性内容。