第十一章 认识和学习Bash
- 只要能够操作应用程序的接口都能够成为shell
- 命令行界面的shell几乎各家distributions使用的bash都是一样的
- 命令行界面的传输速度一定比较快,而且,较不容易出现断线或者是信息外流的问题
- 系统上合法的shell写入了/etc/shells这个文件
- bash shell有命令别名设置功能,也就是alias,可以直接以lm这个命令替换ls -al这样的命令,直接执行alias lm=’ls -al’
- 利用type可以知道一个命令是来自外部命令(指的是其他非bash所提供的命令)或是内置在bash当中
- 要换行输入,可以在输入\只有直接按下Enter键,中间不能加空格
- 系统环境变量通常以大写字符来表示
- 利用echo可以显示变量,只是需要在变量名称前面加上$,或者是以${变量}的方式来显示都可以
- 变量的设置规则,变量和变量内容以一个=连接,等号两边不能有空格符
- 变量内容若有空格符的时候可以使用双引号“”或者单引号‘’将变量内容结合起来,但是双引号内的特殊字符如$等,可以保持原有的特性,单引号内的特殊字符将特殊符号变成一般字符串
- 在一串命令当中,如果还需要通过其他的命令提供的信息,可以使用反单引号`命令`或“$(命令)”,例如直接执行version=\$(uname -r),就可以将uname -r执行得到的结果赋值给version
- 取消变量的方法为使用unset 变量名称
- 在子进程中无法使用父进程中的自定义变量
- 双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号
- 在一串命令当中,反单引号`内的命令将会被先执行,而其执行出来的结果将作为外部的输入信息
- 使用变量可以简化很长的目录,这样就不用每次进入那个目录都cd很多次
- 用env查看环境变量与常见环境变量说明
- RANDOM这个变量的内容介于0~32767之间,如果想要使用0~9之间的数值,可以declare -i number=$RANDOM*10/32767
- 用set可以查看所有变量(含环境变量与自定义变量)
- PS1是命令提示符,其中\u表示目前用户的账号名称,\d可以显示出“星期月日“的日期格式这种
- $本身也是个变量,代表的是目前这个shell的线程代号,即所谓的PID,echo $$
- ?这个变量表示上一次执行的命令所回传的值,一般来说,如果成功执行一个命令,则会回传一个0值,如果执行过程发生错误,就会回传”错误代码“
- 子进程只会继承父进程的环境变量,子进程不会继承父进程的自定义变量
- export 变量名称 可以引用自己的变量设置给后来调用的文件或其他程序
- 查询Linux支持的语系,使用locale来查询
- 整体系统默认的语系定义在/etc/sysconfig/i18n这个文件中
- 被export后的变量,我们可以称它为”环境变量“
- 环境变量=全局变量,自定义变量=局部变量
- 要读取来自键盘输入的变量,使用read这个命令
- declare或typeset是一样的功能, 都是生命变量的类型,变量类型默认为字符串,bash环境中的数值运算,默认最多仅能达到整数类型,所以1/3结果是0
- declare -r可以将一个变量设置为只读变量,如果不小心将变量设置为只读,通常得要注销再登陆才能复原该变量的类型了
- 数组变量类型 var[index]=content
- 一般来说,直接以${数组}的方式来读取
- bash可以限制用户的某些系统资源,包括可以打开的文件数量、可以使用的CPU时间、可以使用的内存总量等,用ulimit来设置
- #代表从变量内容的最前面开始向右删除,且仅删除最短的那个;##表示替换文字的”最长的“那一个
- %表示从变量内容的后面向前面删除,至于%与%%的意义与#及##类似
- username=${username:-root}加上冒号后,被测试的变量未被设置或者已被设置为空字符串时,都能够使用后面的内容
- 使用alias可以进行命令别名的设置,比如alais lm=’ls -l | more’,要想知道目前有哪些命令别名的时候,直接执行alias即可
- history可以显示历史执行过的命令,保存到~/.bash_history当中,注意这是个隐藏文件,显示之后,可以直接利用!n来执行第n个命令
- 由于多重登陆会导致history的写入问题,所以尽量使用单一bash登陆,再用作业控制来切换不同的工作,类似多线程的数据写入问题
- 命令运行的顺序按以下:先alias再builtin,再由$PATH找到/bin/echo这个命令(拿echo举例)
- bash的登陆界面与欢迎信息写在/etc/issue里,但是当使用telnet连接到主机时,主机的登录界面显示的是/etc/issue.net而不是/etc/issue,如果想让用户登陆后取得一些信息,例如你想要让大家都知道的信息,那么可以将信息加入到?etc/motd里面去
- 取得bash时需要完整的登陆流程的,就成为login shell,所读取的个人偏好设置文件主要有三个,依序分别是~/.bash_profile,~/.bash-login,~/.profile,login shell的设置只会读取上面三个文件中的一个,而读取的顺序则是依照上面的顺序
- source或小数点.可以直接读入环境配置文件而不用注销登录
- ~/.bash_layout这个文件记录了当我注销bash后系统再帮我做完什么操作后才离开
- 通配符:*代表0到无穷多个任意字符,?代表一定有一个任意字符,[-]代表在编码顺序内的所有字符,[^]代表只要是非a,b,c的其他字符就接受的意思
- 在script当中#表示批注符号
- 数据流重定向redirect表示将某个命令执行后应该要出现在屏幕上的数据传输到其他的地方,例如文件或者是设备(例如打印机之类的)
- standard output与standard error output,标准输出指的是命令执行所回传的正确的信息,而标准误输出可理解为命令执行失败后,所回传的错误信息
- 标准输入stdin代码为0,使用<或<<;标准输出stdout,代码为1,使用>或>>;标准错误输出stderr,代码为2,使用2>或2>>,两个>>表示想要将数据累加而不想要将旧的数据删除
- 要想将错误信息忽略掉而不显示或存储,使用黑洞设备/dev/null,可以吃掉任何导向这个设备的信息
- 要想将两条数据同时写入同一个文件,可以使用2>&1,不会造成写入次序的错乱
- 小于号<表示将原本需要由键盘输入的数据改由文件内容替代,例如cat > catfile << “eof”表示在输入eof这个关键字之后,立刻就结束而不需要输入ctrl+d
- 使用命令输出重定向的原因:屏幕输出的信息很重要,而且我们要将他存下来;后台执行中的程序,不希望它干扰屏幕正常的输出结果时;一些系统的例行命令的执行结果,我们希望它可以存下来时;一些执行命令的可能已知错误信息时,想以”2>/dev/null“将它丢掉时;错误信息与正确信息分别输出时
- 在同一行中,命令与命令之间利用分号;隔开,这样一来分号前的命令执行完后就会立刻接着执行后面的命令了
- 命令是一个接一个去执行的,因此,如果真的要使用判断,那么这个&&与||的顺序就不能搞错,一般来说,假设判断这样使用command1 && command2 || command3
- 管道命令|只能处理由前面一个命令传来的正确信息,也就是standard output的信息,对于standard error并没有直接处理的能力
- 选取命令,cut是在一行信息当中取出某部分我们想要的,而grep则是分析一行信息,若当中有我们需要的信息,就将该行拿出来
- 排序命令,sort可以依据不同的数据类型来进行排序,默认以第一个数据且默认以文字类型排序;uniq可以将重复的数据仅列出一个显示;wc可以帮我们计算输出的信息的整体数据,包括多少字多少行多少字符
- 双向重定向,tee命令会同时将数据流送与文件与屏幕,tee可以让standard output转存一份到文件内并将同样的数据继续送到屏幕去处理
- 字符转换命令,tr可以用来删除一段信息当中的文字,或者是进行文字信息的转换;col将tab键转换成对等的空格键或者在文字内有反斜杠时,仅保留反斜杠最后接的那个字符;join可以将两个文件当中有相同数据的那一行加在一起,在使用join之前,你所要处理的文件应该要事先经过排序处理;paste比join简单一些,直接将两行贴在一起,且中间以[tab]键隔开;expand将[tab]按键转成空格键,unexpand可以将空白转成[tab]
- 切割命令split帮你将一个大文件依据文件大小或行数来切割成小文件
- 参数代换,xargs,可以产生某个命令的参数,一般是因为很多命令不支持管道命令,因此我们通过xargs来提供该命令引用standard input之用
- 管道中,减号-可以表示取用前一个命令的stdout
- bash的配置文件主要分为login shell与non-login shell。login shell主要读取/etc/profile与~/.bash_profile,non-login shell则仅读取~/.bashrc
第十章 vim程序编辑器
- 所有的UNIX LIKE系统都会内置vi文本编辑器,其他的文本编辑器则不一定会存在
- 基本上vi共分为三种模式,分别是一般模式、编辑模式与命令行模式
- 在一般模式下可以进行删除、复制、粘贴等操作,但是无法编辑文件内容,按下任意一个字母进入编辑模式,按下esc键可退出编辑模式
- 一般模式与编辑模式及命令行模式可以互相切换,但编辑模式与命令模式之间不可以互相切换
- 在一般模式中输入:wq保存后离开vi
- 可以使用强制写入,使用:wq!,不过要在权限可以改变的情况下才能成立
- gg移动到这个文件的第一行,相当于1G;dd删除光标所在的那一整行;n[Enter]n为数字,相当于向下移动n行;yy复制光标所在的那一行
- 在vi中,数字是很有意义的,数字通常代表重复做几次的意思,也有可能是代表去到第几个什么什么的意思
- 在用vim编辑的时候,vim会在被编辑的文件的目录下再新建一个名为.filename.swp的文件,为了出于意外情况考虑,要恢复的时候使用recover的选项,此时vim就会载入swp文件的内容,不过这个文件并不会在你结束vim之后自动删除,要自行删除
- 界面右下角如果有显示目前光标所在的行列号码时,代表使用的是vim
- 当我们按下v或者V或者[Ctrl]+V时,这个时候光标移动过的地方就会开始反白,y表示将反白的地方复制起来,d表示将反白的地方删除
- 多文件编辑,:n表示编辑下一个文件,:N表示边际上一个文件,:files表示列出目前这个vim打开的所有文件
- 要想在新窗口启动另一个文件,就加入文件名,否则仅输入:sp时,出现的则是同一个文件在两个窗口间
- vim会主动将你曾经做过的行为记录下来,好让你下次可以轻松作业,那个记录操作的文件就是:~/.viminfo
- vim的环境设置参数有很多,如果想要知道目前的设置值,可以在一般模式时输入:set all来查阅
- DOS与Linux的断行字符是不一样的,在DOS中使用的断行字符为^M$,我们称为CR和LF两个符号,在Linux下面,仅有LF($)这个断行符号
- 由于16条所述,如果在不同的系统之间复制一些纯文本文件时,千万记得要使用UNIX2dos或者dos2UNIX命令来转换一下断行格式
- vi的界面大致可分为两部分,上半部的本文和最后一行的状态+命令行模式
- 进入编辑模式几乎只要记住i,o,R这三个按钮即可,尤其是新增一行的o与替代的R
第十三章 学习shell script
- shell script有点像是早期的批处理文件,即是将一些命令汇整起来一次执行,但是shell script拥有更强大的功能,那就是它可以进行类似程序的编写,并且不需要经过编译就能够执行
- 几乎所有的UNIX LIKE上面都可以跑shell script,连Windows系列也有相关的script仿真器可以用
- shell script用在系统管理上是很好的一项工具,但是用在处理大量数值运算上,就不够好了,因为shell script的速度较慢,且使用的CPU资源较多,造成主机资源的分配不良
- shell script中如果读取到一个Enter符号(CR),就尝试开始执行该行或该串命令;#可作为批注,任何加在#后面的数据将全部被视为批注文字而被忽略
- shell.sh文件必须具备可执行rx权限,就可以使用直接命令执行;或者通过bash的进程来执行,通过bash shell.sh或sh shell.sh来执行;我们也可以使用sh的参数,如-n或-x来检查与追踪shell.sh的语法是否正确
- script中有几个规范:第一行#!/bin/bash声明这个script使用的shell名称,下面也要有主要环境变量的声明,PATH和LANG这两个是当中最重要的
- 可以利用exit这个命令让程序中断,并且回传一个数值给系统,利用这个exit n(n是数字)的功能,我们还可以自定义错误信息
- 编写script的工具最好使用vim而不是vi,vim会有额外的语法检验机制
- 直接命令执行或者是用bash来执行的话,该script都会使用一个新的bash环境来执行脚本内的命令,当子进程完成后,子进程内的各项变量或操作将会结束而不会传回到父进程中;利用source来执行脚本的话,则会在父进程中执行
- 利用test命令可以进行测试功能
- 要在bash的语法当中使用中括号作为shell的判断式时,必须要注意中括号的两端需要有空格符来分割
- shell script有一些默认变量,比如$0,$1等,执行的脚本文件名为$0这个变量,shift会移动变量,而且shift后面可以接数字,代表拿掉最前民的几个参数的意思
- 条件判断式,if [ ]; then fi
- 利用case esac判断
- 利用function功能,因为shell script的执行方式是由上而下、由左而右,因此在shell script当中的function的设置一定要在程序的最前面
- function也是拥有内置变量的,它的内置变量与shell script很类似,函数名称代表$0,而后连续的变量也是以\$1,\$2…来替代的
- 循环,while do done,until do done不定循环
- for…do…done固定循环,比如for animal in dog cat elephant,或者for((i=1;i