Linux视频学习笔记(十三)--Shell基础(一)
声明:本系列文章是博主根据 “兄弟连新版Linux****”做的笔记和视频截图,只为学习和教学使用,不适用任何商业用途。
PS:文章基于Linux版本CentOS6.9,如果对Linux感兴趣,建议去看《细说Linux》,沈超老师和李明老师的教学风格我很喜欢:)
第十章 Shell基础
视频10.1 Shell概述
1.Shell是什么
Shell的工作过程:简单来说,我们在Linux中写的命令都是能看懂的ls等命令,但是Linux内核智能识别0101机器语言,所以需要Shell命令解释器把命令编译为机器语言,然后让硬件去执行;执行返回的结果交由内核,Shell命令解释器再把内核的机器语言反编译成我们能看懂的命令。
Shell也是一种编程语言,是解释执行的脚本语言,所见即所得,而且在Shell中可以直接调用Linux系统命令。
Java是编译执行的编程语言,但先编译成字节码,再由jvm解释成二进制代码,编译执行与解释执行区别,传送门:https://www.cnblogs.com/Downtime/p/7928579.html
综上所述,Shell是一个命令解释器,同时Shell也是一个功能强大的编程语言。
2.Shell分类
主要分Bourne Shell与C Shell:
主流用到的还是Bash:
3.Linux支持的Shell
进入/etc/shells文件可以查看当前Linux系统支持的Shell语法:
切换shell语法:
- sh
sh也称Bsh,不同于Bash,单用户、系统修复模式用的就是sh,界面也会改变:
在sh下,输入exit命令即可退回到Bash模式:
2) csh
csh界面与Bash模式相同,但语法不同,同样的exit可以退出此模式:
我安装的Linux版本没有此模式,视频中的Linux版本有:
- /sbin/nologin
在/etc/passwd文件中,第七个位置上除了bash表示当前登录用户的登陆模式,以及/bin/sync、/sbin/shutdown等表示一个命令外,还有一种是/sbin/nologin表示当前用户不允许登录,当然表示一条命令的用户也不能用来登录:
视频10.2 脚本执行方式
- echo输出命令
echo其实是一个直接输出的命令,如果输出的内容中包含空格,需要加双引号,如果内容中包含!等特殊字符,需要将双引号变为单引号:
如果使用-e选项,就可以输出更复杂的内容:
根据ASCII码输出,可以根据AScii码表,输出相应字符:
输出abcdef:
输出颜色,注意:\e[1;表示开启颜色输出,\e[0m表示结束颜色输出,固定格式:
2.第一个脚本
注意:
在Linux文件中,一般#开头的行代表注释,但是,#!/bin/bash这一行不是注释,而是标识,表示这是一个Shell脚本,必须要加上!
3.脚本执行
两种执行方式:
- 赋予权限并执行:
- 通过bash调用脚本执行,甚至不用给脚本赋予权限
没有x执行权限一样可以通过bash执行:
使用cat 文件名可以查看文件中的内容,使用cat –A 文件名可以查看包括隐藏字符在内的文件内容:
$ 代表换行符;
有时候在Windows中写好一个shell脚本,传入到Linux中执行报错:
使用cat –A 文件名查看文件内容:
发现换行符$都变成了^M$,这是由于Windows中编辑的原因。
使用命令dos2unix将$转换为^M$格式(同样的unix2dos也可将^M$转换为$),再使用cat –A 文件名查看文件内容:
我的Linux系统没有安装dos2unix命令,需要yum –y install dos2unix安装
10.3 Bash基本功能
视频10.3.1 历史命令与补全
1.历史命令
每个用户的保存历史命令的文件路径不同,普通用户user的保存历史命令文件在/home/user/.bash_history文件中,
root用户的在/root/.bash_history文件中保存着上次退出系统之前的历史命令:
但是如果使用history –w就会将缓存中的历史命令保存到/root/.bash_history文件中。
如果修改了/etc/profile文件,需要重启系统才能生效;
2.命令与文件补全
视频10.3.2 别名与快捷键
1.命令别名
使用echo $PATH的方式查看环境变量,注意:要想调用变量的值,需要在变量前加$符:
同样的alias 别名=‘命令’只是暂时生效,要想永久生效,就需要修改/家目录/.bashrc文件:(普通用户为/home/用户名/.bashrc)
貌似unalias 别名不能删除 /家目录/.bashrc 文件中的内容:
2.Bash常用快捷键
视频10.3.3 输入输出重定向
1.标准输入输出
注意:
上面的标准输出(/dev/stdout)和标准错误输出(/dev/stderr)设备文件名写错了
2.输出重定向
注意:
错误命令只有通过2>或2>>才能重定向输出到文件中,而且2和>(>>)之间不能有空格;
但是,在打印日志时不知道输出的到底是错误命令还是正确命令,这时就需要进行判断:
命令 >>文件 2>&1 指先将错误输出(2)保存到正确输出(1)中(>&),再将错误输出和正确输出保存到文件中,效果与命令 &>>文件相同;
>(>>) 与 文件 之间有无空格都可以
注意:
有时不管命令执行结果如何都不想看到,可以使用命令 >>/dev/null 2>&1,表示不保存命令执行时的输出,/dev/null是一个特殊的文件,可以看作一个垃圾箱;
3.输入重定向
wc是一个统计命令,统计输入的行数、单词数(空格隔开的也标识为一个单词)与字节数(包括回车符、空格符):
表示2行3个单词9个字节
wc <文件统计文件中的行数、单词数、字节数:
如果是wc <<hello就是统计输入时的行、单词、字节直至下一个hello:
视频10.3.4 多命令顺序执行与管道符
1.多命令顺序执行
dd是Linux中执行磁盘复制或数据复制的命令,不仅可以复制文件,也可以复制命令,也可以复制磁盘(包括文件系统类型)
上面的例子是将设备文件zero复制到/root/testfile文件,前后两个date命令可以查出复制用了多长时间:
&&与||的用法:
使用 命令 && echo yes || echo no可以判断命令是否正确执行;
2.管道符
注意:
more可以分屏展示,但是只能分屏展示文件的内容,而不能分屏展示命令的结果。而使用命令| more就可以分屏展示命令的结果
netstat -an命令是查询所有的网络连接:
grep “内容” 文件名 命令在文件中搜索包含“内容”的部分:
视频10.3.5 通配符和其他特殊符号
1.通配符
例子:
2.Bash中其他特殊符号
注意:
‘’单引号引用没有特殊含义,””双引号应用中的$、`、\都有特殊含义:
$可以引用变量,``或者$()包含的是命令,\是转义符
例子: