根据jyy的推荐之前一直是使用的fish这个Shell,但是由于很多命令和BASH有出入,涉及到本文最主要的有:
- fish的变量命名是由 set 变量 ‘ ’
- fish的命令提示行是由脚本写的,虽然能用不同的颜色进行提示,但是也造成了很难对其更改(目前所学的知识不足以更改),而BASH可以通过PS1这个变量很轻易地做出改变
介于这些原因主要还是总结BASH的内容,学好BASH再去摸索fish也不失为一种学习方法。
目录
1.2 登录欢迎信息:/etc/issue /etc/motd
1.3.1 相关的配置文件:/etc/profile ~/.bash_profile ~/.bashrc等
2.3.2 观察所有变量(环境变量和用户自定义的变量):set
5.1 标准输出:代码为1 用> >> ;标准错误输出:代码为2 用2> 2>>
6.4 字符转换命令tr col join paste expand
1 bash的操作环境
1.1 命令查找顺序
命令的查找顺序如下:
- 以相对/绝对路径执行命令
- 查找alias的命令别名
- bash的内置命令
- $PATH变量顺序查找到第一个命令来执行
1.2 登录欢迎信息:/etc/issue /etc/motd
/etc/issue保存了bash登录的提示字符串,会有反斜杠来作为变量来使用。
/etc/motd的内容是用户登录后都会见到的信息。
1.3 环境配置文件
1.3.1 相关的配置文件:/etc/profile ~/.bash_profile ~/.bashrc等
login shell和non-login shell区别是前者需要完整的登录流程而后者只需要登录linux可以在终端不需要重复登录。
由图所示,login shell访问/etc/profile(系统整体设置)、~./bash_profile(用户个人设置)两个文件;而non-login shell只会访问~./bashrc。/etc/bashrc还有用户自己定义的umask和PS1提示符等。
1.3.2 配置相关的命令
1.3.2.1 source:读入环境配置文件
source 配置文件名
可以不需要重新登录,读取配置文件并且设置环境,能够在多个不同环境之间切换更加方便。
1.3.2.2 环境终端设置:ssty、set
linux已经为我们配置好了最好的用户环境,例如删除字符用退格(^?)来实现,打断用ctrl+c实现等,但是我们也可以用ssty来自定义这些设置。
set:①显示变量②设置终端值③设置命令输出输入环境
2 变量
变量的使用是需要用$开头,$作为变量替换值将后面所接的变量的值转换出来。
linux重要的一些配置都是变量形式,例如执行文件查找目录$PATH。
2.1 变量的设置规则
- 变量名称只能是英文字母和数字且开头不能是数字
- 变量的设置用= ,且=两边不能有空格: var=vbird
- 双引号内的特殊字符如$等可以保持原有的特性。
- 单引号内特殊字符仅仅是一般字符(纯文本)
- 转义字符可以将特殊字符变成一般字符
2.2 变量的有效范围:export
和C一样:
- 环境变量=全局变量
- 自定义变量=局部变量
如果在一个shell中加载另一个shell即启动子进程,是不可以访问到父进程的局部变量的,这时可以使用export来将局部变量变成全局变量。
2.3 变量设置的操作
2.3.1 观察环境变量:env
通过env可以观察到全部的环境变量与其内容。
- HOME:用户根目录
- SHELL:所使用的SHELL程序
- HISTSIZE:历史命令的条数
- PATH:执行文件查找目录
- LANG:语系数据
- RANDOM:随机数(0-32767)
2.3.2 观察所有变量(环境变量和用户自定义的变量):set
- PS1:提示字符设置。
- $:本shell的PID。可以用echo $$来显示出PID号码
- ?:上一个命令的返回值。echo $?来显示,如果上一条指令成果则会返回0,不成功则非0
- OSTYPE,HOSTTYPE,MACHTYPE:主机硬件和内核等级
2.3.3 显示出变量:echo
echo 变量名
2.3.4 变量内容累加: ${变量} 累加内容
这里其实有三种方式都可以进行累加①变量=$变量:累加内容②变量=“$变量”:累加内容③变量=${变量}:累加内容。但是我们主要记住第三种,这种用的最普遍,值得注意的是冒号也是没必要的,只有第一种需要加冒号作为分割,后两种都有分割所以也可以不需要冒号了。
2.3.5 取消变量设置:unset
2.3.6 语系变量:locale
直接输入locale会显示当前的语言环境,主要是LANG或者LC_ALL,只要这两个设置了,其他没有设置的语系变量都会被这两个变量所替代。locale -a可以显示所有支持的语系环境。
想要变更语系:可以用export将LANG和LC_ALL变成全局变量。例如export LANG=C;export LC_ALL=C这样将整个语系换成C。
2.4 变量键盘读取、数组与声明
2.4.1 读取键盘的输入变量:read
-p接提示字符但是提示字符似乎不可以转译字符;-t 限制时间。
2.4.2 声明变量类型:declare、typeset
declare [] 变量
选项与参数:
-a:变量定义成数组
-i:变量定义成整数
-x:用法等同于export
-r:变量设置成不可更改内容也不嫩unset
-p:单独列出变量类型
将-换成+就可以进行【取消】
变量类型默认是字符串,所以直接输入变量=1+1会被当成字符串,需要加入-i后才会有变量=2,而且bash中的数值运算直到整数。
2.4.3 文件系统与程序限制关系:ulimit
ulimit可以限制用户的某些系统资源包括可以开启的文件数量,可以使用的CPU时间,内存总量等。
2.5 变量内容删除取代与替换
2.5.1 删除:# ## % %%
#或者##、%或者%%后面接需要删除的关键字。
- #:从前往后找替换符合的【最短】那一个
- ##:从前往后找替换符合的【最长】那一个
- %:从后往前找替换符合(从前往后依次匹配关键字)的【最短】的那一个
- %%:从后往前找替换符合(从前往后依次匹配关键字)的【最长】的那一个
${变量#关键字}
2.5.2 替换:/ / 或者 // /
- ${变量/旧字符串/新字符串}:只替换第一个符合的旧字符串
- ${变量//旧字符串/新字符串}:替换所有符合的旧字符串
2.5.3 变量的测试与内容替换:- + : = ?
注意到【-】后面接关键词,str没有设置和和空字符串行为是不同的,但是再加上【:】后就一致了。
3 变量别名与历史命令
3.1 命令别名设置:alias、unalias
alias 别名=‘命令’
3.2 历史命令:history
history [n]
列出最近n条命令
history [-craw] 文件名
值得指出的是!也可以用来执行命令
!number:执行第几条命令
!command:向前查找执行以command开头的第一个命令
!!:执行上一条命令
4 通配符与特殊符号
* | 【0个到无穷多个】任意字符 |
? | 【一定有一个】任意字符 /??? :根目录下的三个字的文件名 |
[ ] | 【一定有一个在括号内的】字符 [abcd]:一定有一个字符是abcd中的一个 |
[ - ] | 【在编码顺序内的所有字符】 [0-9]:一定有一个字符是0到9之间的一个 |
[ ^ ] | 【反向选择字符】 [^abc]:一定有一个字符不是abc中的一个 |
| | 管道 |
; | 连续命令执行分隔符 |
$ | 使用变量前导符 |
> >> | 数据流重定向:输出定向分别是【替换】【累加】 |
< << | 数据流重定向:输入定向 |
` `(是~那个键) | 两个【`】中间是先执行的命令,也可以$( ) |
& | 将命令变成后台任务 |
( ) | 中间为子shell起始与结束 |
{ } | 中间为命令区块的组合 |
# | 注释符号 |
5 数据流重定向
5.1 标准输出:代码为1 用> >> ;标准错误输出:代码为2 用2> 2>>
- 1> :以覆盖的方式将【正确】的数据输出到指定的文件或者设备上
- 1>>:以追加的方式将【正确】的数据输出到指定的文件或者设备上
- 2>: 以覆盖的方式将【错误】的数据输出到指定的文件或者设备上
- 2>>: 以追加的方式将【错误】的数据输出到指定的文件或者设备上
如果想要同时将两股数据写入同一个文件可以用 2>&1或者1>&2。 注意 >文件1 2>文件1 ,这种方式是错误的,会造成两股数据交叉写入文件1。
5.2 标准输入:代码为0 用< <<
简单来说标准输入就是将原本需要键盘输入的数据,改由文件内容来替换。<代表以EOF(ctrl +d)作为输入的结束字符,<<后面接"字符串"代表结束的输入字符不需要输入ctrl+d。
5.3 命令的与和或:&& ||
几个命令之间可以用;来分割,也可以在有关系的命令之间也可以用与和或,其用法和执行情况和C一致。
6 管道命令 |
管道命令只能处理正确的信息,也就是说标准错误会被忽略。
6.1 选取命令:cut、grep
选取信息都是以行作为基本单位来分析的。
- cut:将一行信息中取出某部分是我们想要的
- grep:分析一行信息,若当中有我们想要的取出一行。
cut -d'分隔字符' -f 数字 <==用于有特定分隔符
cut -c字符区间 <==用于排列整齐的信息
-d:后面接分割符
-f:后面接数字表示第几个分割区间 若多个类似:1,2取出1和2区间
-c:以字符为单位取出固定字符区间 可以用n1-n2,若没有n2表示到结尾
grep [] '查找字符' 文件名
-a:以二进制查找
-c:计算找到字符的次数
-n:顺便输出行号
-v:反向选择,显示出没有查找字符的行
6.2 排序命令:sort、wc、uniq
- sort:就是简单的排序命令
- uniq:可以将连续重复的数据仅列出一个显示 uniq -c可以进行计数
- wc:可以计算出输出信息的行数、字数、字符数
6.3 双向重定向:tee
数据流分别送到文件与屏幕
tee [] file
6.4 字符转换命令tr col join paste expand
- tr:用来删除(-d)或者替换(-s)一段信息中的文字
- col:tab转换成对应数量的空格
- join:将两个文件中有相同数据的一行加在一起(可以用-t12等参数指定哪个栏位来比较)
- paste:将两文件相同行数数据加在一起,中间tab隔开
- expand:tab转换成空格
6.5 划分命令:split
可以将大文件按照单位(-b -k -m)或者按照行数(-l)划分成多个小文件
6.6 参数代换:xargs
很多不支持管道的命令用xargs来提供改命令的标准输入。例如由于id这个命令只支持一个参数,如果直接用管道命令会将太多的参数传入,这时我们可以用xargs -n 1 id 来给id每次只传一个参数,这样就能使用id这个命令了。这是个很好的小玩意儿。
6.7 【-】的作用
可以用来代替需要输入/输出文件的地方传入标准输入/标准输出。所以某些需要用到文件名的地方,可以利用-来代替stdin与stdout。