shell基础

shell是什么?

Shell基本上是一个命令解释器,类似于DOS下的command。它接收用户命令(如ls等),然后调用相应的应用程序。

不同的组织机构开发了不同的 Shell,常见的 Shell 有 sh、bash、csh、tcsh、ash 等。bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。

查看电脑支持的shell

1
cat /etc/shells

如果你不知道怎么搭建一个Centos7系统,可以参考这篇文章:传送门

常用命令

  1. echo 输出命令

通过 -e 参数可以支持字符转换,\r\n表示回车换行

1
2
3
4
5
6
[root@localhost ~]# echo hello
第一行
[root@localhost ~]# echo -e "hello\r\nworld"
hello
world
[root@localhost ~]#

注意上面的代码,有的用了双引号有的没有用,那么接下来讲一下其他符号的用法。

符号 作用
‘’ 单引号。在双引号里特殊符号都没有特殊含义
“” 双引号,在双引号里特殊符号都没有特殊含义,但是 $ ` \ 例外
` 反引号,扩起来的是系统命令
$() 和反引号一样
# 在shell脚本中,#开头的行代表注释
$ 用于调用变量的值
\ 转义符号

单引号和双引号都能关闭shell对特殊字符的处理。不同的是,双引号没有单引号严格,单引号关闭所有有特殊作用的字符,而双引号只要求shell忽略大多数,具体的说,就是①美元符号②反引号③反斜杠,这3种特殊字符不被忽略。 不忽略美元符号意味着shell在双引号内部也进行变量名替换。

  1. 编写执行shell

shell脚本都是以 .sh 结尾的,新建的文件默认都是没有执行权限的,要自己修改权限。

1
2
3
4
5
6
7
8
9
// 编辑文件
vi hello.sh
// 输入内容
#!/bin/bash
echo -e "\e[1;34m hello world \e[0m"
// 修改权限
chmod u+x hello.sh
// 执行脚本
./hello.sh
  1. 历史命令

可以通过history查看你输入的历史记录,临时输入的命令还在内存中,还没有存到磁盘中,可以通过history -w把它写到磁盘中去,磁盘文件地址是~/.bash_history,默认保存1000条。通过history -c清空历史记录。

1
2
3
4
5
[root@localhost ~]# history
60 ls
61 history
[root@localhost ~]# !60
// !表示执行第几条命令

输出重定向

直接输出内容都是在显示器中显示的,但是可以把输出的内容写入到文件中去,我们称为重定向。输入输出分为3种。

设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出
1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# ls > t.txt
[root@localhost ~]# cat t.txt
anaconda-ks.cfg
app
Dockerfile
hello.sh
original-ks.cfg
package-lock.json
test.js
t.txt
[root@localhost ~]#

需要使用到的命令

  1. 命令 > 文件 将标准输出的内容存放到一个文件中,如果文件中有内容将会被覆盖
  2. 命令 >> 文件 将标准输出的内容存放到一个文件中,如果文件中有内容将在末尾追加
  3. 命令 >& 文件 默认是不可以把错误输出写入到文件中去,可以通过把标准输出和错误输出一起写到文件中去

LINUX默认输入是键盘,输出是显示器。你可以用重定向来改变这些设置。比如用wc命令的时候本来是要手动输入一篇文字来计算字符数的,用了重定向后可以直接把一个已经写好的文件用‘<’指向这条命令,就直接可以统计这个文件的字符数等了。输出也是一样,你可以把屏幕输出重定向到一个文件里,再到文件里去看结果。

wc命令的功能为统计指定文件中的行数、字数、字节数, 并将统计结果显示输出

多命令顺序执行

通常情况我们一次要执行多个命令,那么如何保证多个命令的执行顺序呢,就要用到以下符号来处理了。

多命令执行符 格式 作用 案例
; 命令1;命令2 多个命令执行,命令之间没有任何逻辑联系- echo 1;echo 2;
&& 命令1&&命令2 逻辑与 当命令1正确执行,则命令2才会执行 当命令1执行不正确,则命令2不会执行- echo 1&&echo 2;
\\ 命令1\\命令2 逻辑或 当命令1执行不正确,则命令2才会执行 当命令1正确执行,则命令2不会执行- echo 1\\echo 2;
  1. 命令1|命令2 管道符:命令1的正确输出会作为命令2的操作对象

  2. 通配符:匹配文件名和目录名

通配符 作用
? 匹配一个任意字符
* 匹配0个或任意字符,也就是可以匹配任意内容
[] 匹配中括号中任意一个字符
[-] 匹配中括号中任意一个字符,-代表范围
[^] 匹配不是中括号中的一个字符