前言
我有不少同事学了shell很久,最后来一句学不会,或者学会写几个代码段子过一阵子不用也就忘记了。我并没有专门学过shell,也从不钻研它,比如有人用shell写图形界面,有人用shell写游戏,包括更大型的程序。其实这种人我也佩服的,但是我觉得写代码最好要使用匹配场景的语言,shell我只用来写一些简单的插件,再复杂的需求我会用Python,如果是工程项目我会用golang就这样。
怎么才叫学会一门语言
这个问题看似简单,实则还挺复杂的,大学的时候我觉得学会一门语言就是学会它的语法,当我学会了c的语法的时候,我就骄傲的说我学会了c,当然现实啪啪啪的打脸。我无法用c完成任何一项编程工作。可能也有人觉得学会一门语言就是学会它主要的标准库,比如python,学会主要的标准库就可以做很多事情了。也可能有人觉得学会一门语言首先要学会一些框架,比如写网站,如果不懂几个框架,很难在公司和同事合作完成项目。其实我现在也不知道如何算是学会一门语言了,当我在工作中使用多门语言后,后来又频繁的参与管理工作,很多时候我甚至忘记了一些语法和标准库的使用,但是考虑目前网络的发达,目前我还没遇到明显的困难。
shell简述
本课程使用的bash,当然还有dash、zash等等,但是bash是大多数Linux系统的默认shell环境,因此本书以bash为主,另外bash也分为不同的版本,不同的命令可能稍有不同,这是正常现象。命令行操作早年是被微软所排斥的,但是直到现在shell依然没有退出舞台,微软反而也搞了powershell和linux子系统,这说明shell命令行操作自有它的地位。shell作为老牌的脚本语言,活力仍在,但是缺点也不少,现在主流的运维思路是简单的用shell,复杂的用python。
一些要求
- 学会使用百度、必应等,不要较真,士气宜扬不宜竭,不然慢慢就学不动了
- 勤动手,搞技术讲究用进废退(扎马克的理论)
- 不要患得患失,这个技术我学不会、这个技术太低端我要学更高端、这个教程不好我找更好的教程
- 分享精神,自己学到更好的知识,或者自己的经验总结要分享出来
基本的终端操作
终端的命令行有的时候会很长,如果我们有敲错的地方肯定不能重新敲所有的地方,因此需要使用一些快捷键来帮助我们编辑,当然不使用也可以。
快捷键 | 说明 |
---|---|
ctrl+a | 跳到命令行的开头 |
ctrl+e | 跳到命令行的末尾 |
ctrl+u | 将光标处到命令行开头的内容清除 |
ctrl+k | 将光标到末尾的内容清除 |
Ctrl+H | 删除光标的前一个字符 |
Ctrl+W | 删除光标前的单词(Word, 不包含空格的字符串) |
ctrl+r | 在历史记录中搜索某个曾经使用过的命令 |
ctrl+l | 清理屏幕 |
ctrl+c | 中断当前执行的程序 |
ctrl+p | 上翻历史执行命令,相当于光标上键 |
ctrl+n | 下翻命令,相当于光标下键 |
Ctrl+Z | 把当前进程放到后台(之后可用''fg''命令回到前台) |
Shift Insert | 粘贴(相当于Windows的Ctrl V) |
鼠标中间 | 在命令行窗口选中即复制,在命令行窗口中键即粘贴,可用Shift Insert代替 |
文本编辑器(vim)
vim脱胎于vi,是linux中最受欢迎的文本编辑器,vim的基本功能就已经非常的强大,然而它还支持各种扩展,甚至被当做ide来使用,这里面先给大家介绍基本功能,其实说是基本功能但是也已经够用了。vim的功能太多了,这里我们直接看别人的文档,我选一些简单的操作给大家讲解vim介绍
工作中常用的shell命令
shell的命令上千个,这里就简单介绍一些我们容易用到的命令,以及在脚本中用到频率较高的命令,同时也不提倡死记命令,这和高中学英语背单词没啥区别,不用的时候全都忘记了,但是依然给大家一个学习常见可以学习命令的地方:传送门
-
echo
bash中向终端打印的命令,用来输出我们想让别人在终端看到的信息,下面我们看下基本用法
# 打印字符串
>>> echo hello world 或
>>> echo "hello world"
out: hello world
# 打印变量
>>> a="hello world"
>>> echo $a
out:hell world
当然在脚本中,echo主要是用来输出函数执行信息和错误信息帮助我们判断脚本的执行情况,下面列举部分,当然更多的请看这里传送门,我们利用不同的颜色显示我们需要的信息级别,比如红色一般用于error信息,其他的可酌情考虑
>>>echo -e "\033[30m 黑色字 \033[0m"
>>>echo -e "\033[31m 红色字 \033[0m"
>>>echo -e "\033[32m 绿色字 \033[0m"
>>>echo -e "\033[33m 黄色字 \033[0m"
>>>echo -e "\033[34m 蓝色字 \033[0m"
>>>echo -e "\033[35m 紫色字 \033[0m"
>>>echo -e "\033[36m 天蓝字 \033[0m"
>>>echo -e "\033[37m 白色字 \033[0m"
![](https://static.studygolang.com/190813/1196423f4c3da7f503f787ecf68129ee.png)
-
cat
cat是bash中的输出文本内容之一,bash中输出文本的方式及其的多,cat是最常见之一,看下常见用法:
# 查看文件内容
>>>cat file
# 同时查看多个文件内容
>>>cat file1 file2
#拼接文档
>>>cat file1 file2 >file3
当然还有一个常用的地方,就是在脚本中写文本,如果在脚本中直接写一个有内容的文本,让我们来看下
>>> cat >testfile <<EOF
>你好
>hello world
>EOF
#此时生成一个testfile文件,我们打开它
>>> cat testfile
![](https://static.studygolang.com/190813/bd3942fd1500cc6cb4fb0442a4297a67.png)
2.tail
tail命令可以查看文件的内容,当然最常用的是tail -f 查看正在改变的日志文件
# 查看文件倒数几行
>>> tail -n 10 file
>>> tail -f /var/log/xx.log #连续输出新的日志内容
3.more/less
more和less的功能差不多,都是整屏显示文本,显示不下的可以回车向下显示,less比more有更多的查看功能,它的快捷键和vim是类似的
# 分页查看文件 按空格翻页 q退出
>>> more file
>>> less file
4.split
split作为运维常见的命令之一,用于切割文件,一般运维场景用于切割日志
#先创建一个100kb的测试文件,我们使用dd命令,当然这个命令在运维中不太使用
>>> dd if=/dev/zero bs=100k count=1 of=data.file
# 切割文件 -b 按字节数,字母命名
>>> split -b 10k data.file
#切割文件,数字命名
>>> split -b 10k data.file -d
# 将file按每1000行切割为多个文件
>>> split -l 1000 file
5.diff
diff是一个好玩的命令,它可以比对两个文件的差异,vimdiff是它的升级版,可以使用vim来查看比对的文件,当然这里我们只介绍diff,这个命令有很多选项,但是别钻牛角尖,我们只要会一个就足够了:
# 按行比较两个文件
>>> diff file1 file2
>>> diff testfile1 testfile2>testfile.patch
5.patch
diff记住一种用法足以,就是因为这一种用法是可以配合patch使用,我们运维中经常改配置文件或者程序,我们可以通过patch解决,当然也可以通过替换整个文本解决,各有好处。俗称“打补丁”,注明的分布式代码管理工具git就是用此原理,patch也有很多的选项,一般我们可以不需要深究。
# 修补文件,可用于和diff配合
# 将testfile1修改为testfile2一样的文件
>>> diff testfile1 testfile2>testfile.patch #生产差异文件
>>> patch testfile1 testfile.patch #把testfile1升级成testfile2,或
>>> patch testfile1 <testfile.patch
6.find
Linux find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示 .这个命令也是选项超级多的,先知道简单的用法,复杂的百度即可
>>> find . -name "*.md" #查找当前目录的md结尾的文件
>>> find . -ctime -7 #查看最近七天内的修改过的文件
>>> find . cmin -30 #查看最近30分钟内修改过的文件
>>> find . -type f -perm 644 #查找类型为文件的,权限为读写权限的文件
>>> find . -size +512k #查找大于512k的文件
>>> find . -size -512k #查找小雨512k的文件
>>> find / -size +50M -size -100M #查看大小在50Mb到100Mb之间的文件
>>> find . -iregex ".*md" #按照正则表达式搜索文件(iregex 为regex区分大小写模式)
find 命令有另外一个组合用法file ... exec...,exec用来处理find搜索到的执行文件
>>> find . -type f -exec ls -l {} \; #搜索当前文件夹的文件并ls -l打印
>>> find /tmp -type f -name "*.txt" -exec rm -f {} \;#删除tmp目录下txt结尾的普通文件
find 命令的另外一个组合用法是 find ... ok... 。ok代表着执行后面的过程过先让用户确认,比如删除文件的时候
>>> find . -iregex ".*md" -ok ls -l {} \; #通过正则查询出md文件并提示是否显示他们
>>> find /tmp -type f -name "*.txt" -ok rm -f {} \; #查找txt结尾的普通文件并提示是否删除
7.watch
watch这个命令是超级实用的,可以帮我们动态监控一个本来是静态的命令输出
>>> watch -d free #查看内存的动态变化,free是内存查看命令,同样我们也可以查看自己想看的文件变化
>>> watch -n 2 -d free #每两秒刷新一次
>>> watch -n 2 -d cat /opt/fonsview/3D/data/nices #实际的生产场景的用法
总结
shell的命令行使用以及部分命令的展示就到这里,shell命令较多,建议大家使用的时候利用搜索引擎查询即可。
有疑问加站长微信联系(非本文作者)
![](https://static.golangjob.cn/static/img/footer.png?imageView2/2/w/280)