《鸟哥的linux私房菜》读书笔记(部分)
x86是一种微机系统硬件架构,另一种是苹果的mac的架构
linux将所有的设备,软件都抽象成了文件
早期的计算机硬件厂商都有自己定制的操作系统
没有核心和驱动的概念,直接通过操作系统操作硬件
4,2,1在二进制中为100,010,001能很好的执行位操作,也表示r,w,x(注意顺序),chmod结合这这几个数字可以很好的进行文件属性的修改。另外一种比较具有可读性的做法是用ugoa来表示不同的用户角色,用rwx表示不同的权限,用+-=来表示不同的权限设置方式
目录的权限高于目录下文件的权限,即某用户拥有某目录下的w权限,将同时拥有该目录下文件的增删查改的权限,即使文件是root创建的
对于目录来说,x表示是否能进去此目录
设备文件分块设备(硬盘)和字符设备(键盘鼠标)文件
一个文件的属性跟文件的扩展名没关系,扩展名只是为了人类容易识别文件的属性,linux是通过文件开始的十个属性(rwxigo)有关
/etc是用来放配置的
/opt是用来装软件的
/dev都是各种设备
/proc的内容会加载到内存,也可以理解为内存中内容的一个持久化
/home各种用户私人的信息
/root超级用户的信息
/bin可执行命令
/sbin超级用户专属可执行命令
/tmp可以理解为垃圾桶,回收站
/usr类似软件目录programfiles
/var是用来存放系统运行过程中软件产生的数据
在vi中,一般模式下的命令中,如果数字在前面表示向后多少行比如10yy表示从当前行往后复制10行,而后面的数字表示向前(可能是行,也可能是字符个数,一般只有0和1)。
很多命令字符都很难跟具体的含义关联起来,或者没有规律(经常见到的情况是将命令表放在眼前位置),这个导致不用的命令很容易忘记。但也有好记的,比如y会跟复制联系起来,因此可以理解为copy中的y。
0表示移动到当前行第一个字母的处,这个很不好记,但很常用
J表示和下面的行合并,可以理解为join
p表示粘帖到当前行下面,可以理解为paste
一般同一个命令的小写表示向后,大写表示向前,p表示粘帖到后面,P表示粘帖当到前面,x表示删除后面一个字符,X表示删除前面一个字符,但也有反例,比如A,在最后插入
u是undo好理解,r表示redo,却要带上ctrl,这个主要是为了跟替换(replace)的r区别,这个只能死记,多用
a在字符后面插入,可以理解为after
o插入空行,只能死记了,可以想象kong中的o
!有强制的意思,比如强制退出,强制写入
vi每次编辑会将当前修改文件做一个后缀为swp的文件,用来保存最新的更新状态。
vim的标准记录都会写在~/.viminfo文件中
:setnu是显示行号的简写形式
shell是用来向核心下达命令的,相对于核心来说,他就是一层壳
变量赋值等号两边不能有空格,这对java写多了的人来说的确不习惯
export扩大了变量的外延:将局部变量变成环境变量
系统变量大写,自定义变量小写
转义字符甚至可惜可惜转义空格
字符串的累加用的是冒号,相当于字符串的join
"$name"和${name}是一回事
单引号中的特殊字符就是特殊字符,双引号则有变量特性,这个主要针对$来说的
变量使用的两个场景:将常用的很长的路径用一个简短的变量简化;不同的场景具有不同的值,这时会用到环境变量
几个特殊的变量:$表示当前进程id,?表示前一个命令执行的返回值
脚本的默认类型是字符串,若要声明其他类型,需要使用declare。
数组是脚本中的一种常用类型
${var}也可以执行自责字符串操作,比如删除,替换指定的字符,%,#是删除,/是替换,双数则是全局操作
对特别长的命令,请使用别名
rm删除操作,最好加上-i给出提示
关于history的知识:!!表示执行前一个命令;!command则是搜索命令,相当于自动完成功能,等同于ctrl+r
当前目录不是执行命令搜索的默认路径
因此要执行当前命令,需要这样写:./command
~表示是当前用户目录,cd~就更好理解了
bash_profile在登陆的时候读取,bashrc在每次执行脚本的时候读取。优先级是后者为高,即最后读取,一般将个人偏好设置放在bashrc中
set-x执行前显示命令内容,在调试时比较有用
set-u使用未定义的变量会报错,这个容易帮助我们检查出变量名错误。
[!a-z]表示非小写字母,跟正则的^[a-z]不一样
`uname-r`和$(uname-r)具有同样的效果,都是先被执行
命令的返回结果为0表示执行成功,可惜作为条件为真的判断,这个可惜结合||,&&逻辑判断使用,这个逻辑判断很有意思,若前面判断为假,||后面的会执行,前面为真,&&后年会被执行。
甚至在某些情况下,结合||和&&可以实现三元操作符的功能:command1&&command2||command3
cut在取段的时候是base1,俺字符取也是一样,针对规则内容比较有意义
sort的排序参数很让人无语的,-f表示忽略大小写,-k用来指定按第几个字段排序,base同样是1
sort和uniq两个命令是一对好基友
即写文件又刷屏用tee
tr=textreplace
^M表示这是一个dos下的回车换行符
join将两个文件合并,并指定合并字段,类似SQL的join操作:将两个表做关联
paste实现两个文件的行与行粘帖
expand用来处理tab和空格之间的转换
xargs用来将输入内容按照一定的规则逐行分解成多个参数给后面接的命令使用,可以将x理解为肢解:-),每分析一行就执行一条命令,我觉得最有用的还是接-i参数,然后在命令行中使用占位符{}。默认命令是echo
在使用管道的时候,有时候会用到-,它一般用来指代操作输入,输出。
正则表达式中的范围符号{}词组做转义,而[]则不必
egrep使用的是扩展正则表达式,|,+,?()符号属于扩展正则表达式的内容
经常分不清?和+,前者可以理解为有木有(零个和一个),后者可以理解为有多少(一个和多个)
sed中的-r就是表示使用的是扩展正则表达式
$((运算内容))这个写法不错
test测试内容&&true||false这个写法也不错
原来test等价判断符号[]比如test-z$HOME等价于[-z"$HOME"],一个重要的地方是判断符号里面的每一个元素要用空格分隔,而且变量要用双引号括起来,shell的一些规律有时候就是感觉很奇怪
shell变量可以是字符串,路径,文件,这个主要取决于是上下文环境,不过如果是字符串最好用引号括起
判断符号之间用||和&&连起来表示ORAND
elseif在shell中会被简写为elif,多写两个字母会死啊
netstat-tuln用来查看当前机器已开的端口
函数一定要放在脚本的前面
函数和脚本的第一个参数都是$1
untildodone条件成立时终止
for循环要用两个括号这个有些无语
forin相当于对一个列表进行遍历,比如稳健夹下的所有文件
shell调试和追踪参数-nvx,早知道这些参数效率会提高不少