往期文章
【Linux】常用指令合集
【Linux】文本编辑器Vim
【Linux】软件包管理
【Linux】用户和用户组管理
【Linux】权限管理
【Linux】文件系统管理
Shell是一个命令解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
如下图所示,最底层是硬件,然后通过内核来管理硬件,但外层的应用程序是内核无法识别的,需要先对程序进行“翻译”成内核可以识别的二进制,这就需要Shell命令解释器来完成。
查看路径/etc/shells,可以看到所支持的Shell。
这些Shell之间是可以切换的,只要在命令行输入名称即可切换,输入切换成sh,输入exit退出。
echo [选项][输出内容]
选项:
-e: 支持反斜线控制的字符转换
例如我想输出hello world,则可输入:
echo hello world
反斜线控制的字符转换有如下格式:
控制字符 | 作用 |
---|---|
\\ | 输出\ |
\a | 输出警告音 |
\b | 退格键,也就是向左删除键 |
\c | 取消输出行末的换行符,和“-n"选项一致 |
\e | ESCAPE键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车键 |
\t | 制表符,即Tab键 |
\v | 垂直制表符 |
\0nnn | 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数 |
\xhh | 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数 |
下面举一些例子:
查表可知十六进制61的ASCII码为a,其他依次类推。
\e[1为开启颜色输出,\e[0m表示结束颜色输出,其中31m代表红色。color可替换为任意内容。
其他颜色:
30m=黑色 31m=红色 32m=绿色 33m=黄色
34m=蓝色 35m=洋红 36m=青色 37m=白色
创建脚本
vim hello.sh
脚本开头加上以下一行内容,注意这不是注释,是标称,标称我以下写的内容是shell脚本,除了这一句,其他用#开头的就属于注释了。
#!/bin/Bash
然后随便写一些内容,保存退出。
有两种方法(第一种比较常用):
chmod 755 hello.sh
#用绝对路径执行,注意这个sh文件夹是我自己创建的,用于储存脚本文件
/root/sh/hello.sh
#用相对路径执行,前提是已经在sh文件夹下
./hello.sh
bash hello.sh
注意:Windows下的shell脚本在Linux下执行时,记得要进行格式转换!,用以下命令:
dos2unix [要转换的文件] #Windows->Linux
unix2dos [要转换的文件] #Linux->Windows
history
选项:
-c: 清空历史命令
-w: 把缓存中的历史命令写入历史命令保存文件~/.bash_history
注意,当前登录状态输入的命令不会保存在文件~/.bash_history,需要退出后才会保存,如果要立刻保存,则可以执行以下命令。
history -w [历史命令保存文件]
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改。
vim /etc/profile
在输入命令或文件时,按Tab键可以自动补全,如果没有补全,说明有多个以该字串开头的命令,再按一次Tab,则会将所有相关命令列出。
设定命令别名
alias 别名='原命令'
查询命令别名
alias
例如,我用vi作为别名代替vim:
alias vi='vim'
其实vi本身也是一个命令,但原本的vi处于第四顺位,别名的优先级更高,所以我执行vi时就相当于执行vim,如果要执行原来的vi则需要用绝对路径,虽然如此,但不建议将原有命令作为别名。
在说说$PATH环境变量,其实在Linux中所有命令的执行都是用绝对路径完成的,但实际上我们在执行命令时只需要输入命令名称即可,这是因为这些命令的绝对路径储存在PATH环境变量中。
修改文件.bashrc
vi /root/.bashrc
按下列格式添加即可:
快捷键 | 作用 |
---|---|
ctrl+A | 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。 |
ctrl+E | 把光标移动到命令行结尾。 |
ctrl+C | 强制终止当前命令。 |
ctrl+L | 清屏 |
ctrl+U | 删除或剪切光标之前的命令。 |
ctrl+K | 删除或剪切光标之后的内容。 |
ctrl+Y | 粘贴ctrl+U或ctrl+K剪切的内容。 |
ctrl+R | 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。 |
ctrl+D | 退出当前终端。 |
ctrl+Z | 暂停,并放入后台。 |
ctrl+S | 暂停屏幕输出。 |
ctrl+Q | 恢复屏幕输出。 |
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/sdtout | 1 | 标准输出 |
显示器 | /dev/sdterr | 2 | 标准错误输出 |
由于设备文件名比较难记,故用文件描述符来描述。
举个例子,当我输入一个指令时,输出应该是在屏幕上,但现在我不让它输出到屏幕,把它输出到文件中,也就是改变了它的输出方向,叫做输出重定向。但为什么要输出到文件中呢?因为该文件可作为一个执行脚本,让系统在指定的时间可以执行该脚本。
标准输出重定向
例如,我将命令ls输出的结果保存在一个文件中:
ls > abc
然后看一下文件abc的内容:
cat abc
我们会发现ls命令输出的结果已经保存在文件中:
如果们需要追加一些命令的输出,则需要用>>,不能用>,否则会将原输出覆盖。
标准错误输出重定向
例如将ls打成lsd,然后把错误输出到abc文件中,则需要多加一个2:
lsd 2>> abc
此时错误已经输出到了文件中。
实际上这种将正确输出和错误输出分别保存的方法用处不大,因为错误输出的前提是我们已经知道了这个命令是错误的,那我们把它改为正确的就好。
下面这种方式才是常用的:
前四种方法都是一样的,即把正确的输出和错误的输出同时保存在同一个文件中。
我们之前的输入都是通过键盘来输入的,如果我们通过文件来输入,这就叫输入重定向(用的不多,了解即可)。
wc [选项][文件名]
选项:
-c 统计字节数
-w 统计单词书
-l 统计行数
输入wc统计键盘输入命令,随便添加一些内容,然后Ctrl+d退出,会出现三个数字,从左到右依次是行数,单词数和字符数(包括回车)
输入重定向的格式如下:
命令<文件 把文件作为命令输入
多命令执行符 | 格式 | 作用 |
---|---|---|
; | 命令1 ; 命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系。 |
&& | 命令1 && 命令2 | 逻辑与,当命令1正确执行,则命令2才会执行,当命令1不执行,则命令2不会执行。 |
|| | 命令1 || 命令2 | 逻辑或,当命令1执行不正确,则命令2才会执行,当命令1执行正确,则命令2不会执行。 |
命令1的正确输出作为命令2的操作对象。
命令1 | 命令2
来看看管道符有什么用,如果我们想要查看etc下的文件,则可输入:
ll -a /etc/
但会发现文件非常多,不符合我们的查看习惯,这时候我们就可以用分页显示命令more,但如果单独执行more,无法分屏显示etc下的文件,那么我们可以使用管道符,在**ll -a /etc/**成功执行的情况下执行more。
ll -a /etc/ | more
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或任意多个任意字符,也就是可以匹配任何内容 |
[] | 匹配中括号中任意一个字符。 |
[-] | 匹配中括号中任意一个字符,-代表范围。 |
[^] | 逻辑非,代表匹配不是中括号内的字符。 |
如果我们要删除一个目录下的所有文件,就可以用*来表示。
例如我们可以进入文件夹tmp,删除该目录下所有文件,一定要确保已经进入tmp目录,别把根目录删了!!!
rm -rf *
然后我们再创建以下几个文件,来看看其他通配符的作用
touch abc
touch abcd
touch 123
touch 0abc
显示字符后面带有abc的文件:
ls *abc
如果要显示abcd,则需要修改为,表示abc后面也允许有其他字符:
ls *abc*
与*不同的是,如果用?,则至少匹配一个字符,例如:
ls ?abc
此时文件abc不会显示,因为abc前面没有与?匹配的字符,只会显示0abc
再来看看通配符[-]
ls [0-9]abc
最后是取反通配符[^]
如下命令表示显示abc前面接除了0-9外的字符的文件。
ls [^0-9]abc
符号 | 作用 |
---|---|
‘ ’ | 单引号。在单引号中所有的特殊符号,如“$”和“`“(反引号)都没有特殊含义。 |
“ ” | 双引号。在双引号中特殊符号都没有特殊含义,但是"$"、“`“和"\"有意义。 |
`` | 反引号。反引号括起来的内容是系统命令,在Bash中会先执行。 |
$() | 和反引号作用一样,推荐用这个。 |
# | #开头的代表注释。 |
$ | 用于调用变量的值。 |
\ | 转义符,跟在\之后的特殊符号失去特殊含义。 |
例子:
符号$、’ ’、“ ”的作用
[root@aubin tmp]# name=sc
[root@aubin tmp]# echo $name
sc
[root@aubin tmp]# echo '$name'
$name
[root@aubin tmp]# echo "$name"
sc
反引号,括起来的是系统命令,与$()作用一样,推荐用后者:
参考资料:
[1] https://www.bilibili.com/video/BV1mW411i7Qf