基于centos7学习总结 -- shell 相关琐碎知识点

什么是shell?

shell 将我们输入的命令与内核进行沟通,好让内核可以控制硬件来正确无误地工作。

type [-tpa] name 查看命令是否是内置命令

type [-atp] name
	-a	将PATH变量定义的路径中,所有包含name的命令都会列出,包括alias
	-t	
		file	表示外部命令
		alias	表示该命令为别名所设置的名称
		builtin	表示bash内置命令
	-p	如果是外部命令,打印出完整的文件名

基于centos7学习总结 -- shell 相关琐碎知识点

命令行快速编辑按钮

基于centos7学习总结 -- shell 相关琐碎知识点

变量

【y=ax+b】等号左边的(y)就是变量,等好的右边(ax+b)就是变量内容。左边是未知数,右边是已知数。

变量又可以分为“环境变量”和“局部变量”,类似于小孩子的存款和父亲的存款,小孩子比较贪财,自己的钱谁也拿不走一分,但他爸爸的钱小孩子却有直接的继承关系。

也就是父类的变量子类可以使用,子类的变量,只有子类可以使用。

变量设置的规则:

  1. 变量只能是字母或数字,但只能字母开头
  2. 变量与变量之间用“=”号连接
  3. 使用变量时使用"${name}"来获得变量的值
  4. 双引号内保留变量符号的属性
  5. 单引号内所有字符均为一般字符(纯文本)
  6. 【\】为转义字符
  7. 在一串命令中,使用【KaTeX parse error: Can't use function '\`' in math mode at position 9: (子命令)】或【\̲`̲子命令\`】来使用子命令,会优…()中的命令
  8. 若该变量为扩增变量时,需要时使用“ 变 量 名 ” 或 变量名”或 变量名”或{变量名}累加内容
  9. 系统默认变量使用的全部都是大写字母,自行设置变量可以使用小写字母
  10. 其他程序想使用“子变量”,可以在子变量中使用export 子变量名将该变量变为环境变量。
  11. 使用“uset”来设置取消变量

注意:变量分为未定义变量和“”变量

查看环境变量

env 或 export
set用来查看环境变量和自定义变量

其中set查看的变量中有一个变量为【SP1】,该变量参数:
基于centos7学习总结 -- shell 相关琐碎知识点

$?  表示上一命令执行结果,成功$?值为0,失败$?值为错误码。

键盘读取、数组与声明

read [-pt] 读取键盘输入的数据
	-p “提示语”	在输入前打印到屏幕上的提示语
	-t	最多等待时常(秒)
declare [-iarx] variable
	-i	定义一个整数
	-a	定义一个数组
	-x	定义一个环境变量
	-r	定义一个只读变量,该变量不可被更改内容,也不可以被unset
	+
	-p	单独列出变量的类型
定义一个数组变量
	var[1]="a1"
	var[2]="a2"
	var[3]="a3"
	echo "${var[1],${var[2]},${var[3]}"

文件系统及程序的限制关系:ulimit

ulimit [-fnutdlaHS] [配额]
	-H :hard limit ,严格的设定,必定不能超过这个设定的数值;
	-S :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告讯息。
	      在设定上,通常soft 会比hard 小,举例来说,soft 可设定为80 而hard 
	      设定为100,那么你可以使用到90 (因为没有超过100),但介于80~100 之间时,
	      系统会有警告讯息通知你!
	-a :后面不接任何选项与参数,可列出所有的限制额度;
	-c :当某些程式发生错误时,系统可能会将该程式在记忆体中的资讯写成档案(除错用),
	      这种档案就被称为核心档案(core file)。此为限制每个核心档案的最大容量。
	-f :此shell 可以建立的最大档案容量(一般可能设定为2GB)单位为Kbytes
	-d :程序可使用的最大断裂记忆体(segment)容量;
	-l :可用于锁定(lock) 的记忆体量
	-t :可使用的最大CPU 时间(单位为秒)
	-u :单一使用者可以使用的最大程序(process)数量。
	-n :限制用户打开的文件个数

变量内容的替换、删除与取代

#:符合取代文字的『最短的』那一个;
##:符合取代文字的『最长的』那一个

变数设定方式			说明
${变数#关键字}	若变数内容从头开始的资料符合‘关键字’,则将符合的最短资料删除
${变数##关键字}	若变数内容从头开始的资料符合‘关键字’,则将符合的最长资料删除

${变数%关键字}	若变数内容从尾向前的资料符合‘关键字’,则将符合的最短资料删除
${变数%%关键字}	若变数内容从尾向前的资料符合‘关键字’,则将符合的最长资料删除

${变数/旧字串/新字串}	若变数内容符合‘旧字串’则‘第一个旧字串会被新字串取代’
${变数//旧字串/新字串}	若变数内容符合‘旧字串’则‘全部的旧字串会被新字串取代’

基于centos7学习总结 -- shell 相关琐碎知识点

例如:
[dmtsai@study ~]$ str="oldvar"; var=${str-novar}
[dmtsai@study ~]$ echo "var=${var}, str=${str}"
var=oldvar, str=oldvar 

历史命令:history

history [-cwrna]
	n	查看最后n条命令表
	-c	清除目前shell中history所有缓存的输入过的命令
	-w	强制将history缓存中的内容更新到~/.bash_history中
	-r	将histfiles的内容读到目前这个shell的history记录中
	-a	将目前新增的history命令新增如histfiles中,
		若没有加histfiles,则默认写入到~/.bash_history

命令查找的顺序:

  1. 以相对/绝对路径执行命令。
  2. 以alias找到该命令执行
  3. 由bash内置的(builtin)命令执行
  4. 通过$PATH变量的顺序查找到的第一个命令执行

bash登陆界面提示信息:

/etc/issue :文件内存储的是通过终端登陆前的提示内容
/etc/issue.net :通过远程登陆终端前的提示内容
/etc/motb :登录后的提示内容

参数:

\d :本地终端时间
\l :第几个终端界面
\m :显示硬件等级(i386/i486...)
\n :显示主机的网络名称
\r :操作系统版本
\t :显示终端时间
\S :操作系统名称
-v :操作系统版本

bash的环境变量配置

如何当前使用的是哪个shell呢?

如果登陆后直接使用的是/etc/passwd 文件内最后一个【:】后面的shell

如果是在可视化界面这使用的是non-login shell

login shell和non-login shell

login shell是从登陆页面进行登陆后bash会自动加载并使用的shell

会先调用/etc/profile 文件,该文件又会去调用/etc/profile.d/*.sh

然后会调用用户个人设置配置文件 ~/.bash_profile

调用个人配置文件时会按顺序调用一下三个文件:
~/.bash_profile
~/.bash_login
~/.profile
如果有第一个则不会再调用其他。

login shell读取流程:
基于centos7学习总结 -- shell 相关琐碎知识点

下面的则是调用的配置文件。

如果修改了.bash_profile配置文件,需要重启才能生效
可以使用 source 来强制生效

source 配置文件名 强制将环境变量配置文件内容刷新到环境变量中。(source 在当前shell 环境中执行脚本文件)

non-login shell
通过Xwindows 右键进入的终端窗口或在shell中开启的shell,在没有输入账号密码的情况下进入的shell子程序中。

这种情况仅会读取配置文件~/.bashrc

如果将~/.bashrc删除了,可以复制/etc/skel/.bashrc到根目录,然后在source下即可;

注意:如果将家目录下的
.bash_profile
.bash_history
.bashrc
误删除了,可以在/etc/skel/找到并复制到家目录即可。

/etc/man_db.conf
man 命令时,会调取该配置文件内的配置信息。如果帮助文档没有在内,则需手动设置下。

shell通配符:

基于centos7学习总结 -- shell 相关琐碎知识点
特殊符号:
基于centos7学习总结 -- shell 相关琐碎知识点

数据重定向:

基于centos7学习总结 -- shell 相关琐碎知识点
注意:当stdout和stderr同时输出到一个文件内时,为了避免交叉输入导致数据错乱,
可以使用(2>&1)来序列输入数据到文件中

[study1@localhost ~]$ echo "error message" 2>/dev/null 1>&2

2>/dev/null 将错误信息丢掉。

命令的执行顺序 ; && ||:

cmd1 ; cmd2

执行完cmd1后执行cmd2

cmd1 && cmd2

当cmd1命令执行完之后,如果$?结果为0,执行cmd2.反之结束

cmd1 || cmd2

当cmd1命令执行结果$?为非0时,执行cmd2,否则不执行cmd2

选取命令:cut、grep

cut [-dfc]
	-d 'char' 以char为分隔符
	-f n	选取分割后的第n列
	-e	选取固定宽度的字符
grep [-vinac] [--color=auto] '查找字符' filename
	-v	取反,即选中没有'查找字符'的行
	-i	忽略大小写
	-a	二进制文件以文本的方式查找数据
	-c	只显示统计查找到的次数
	-n	显示行号

排序命令 sort、uniq、wc

sort	[-ftknMub] [filename or stdin]
	-f	忽略大小写
	-b	忽略开头的空格
	-u	相同的数据只显示一行
	-t	分隔符,默认是tab
	-k	按照哪个区间排列
	-n	以纯数字排列
	-M	以月份进行排列
uniq [-ic] 
	-i	忽略大小写
	-c	进行计数

注意:uniq需要排序后才能进行相同字符的统计

wc	[-lmw] 
	-l	统计多少行
	-m	统计多少字符
	-w	统计多少单词

标题字符转化命令:tr/col/expand/join/paste

tr [-ds] SET1 ...
	-d '' :删除' '字符
	-s '1' '2' :将所有的'2'替换'1'
col [-x]
	-x	将所有的【tab】(^I)用空格替换
expand [-t]
	-t n :将所有的【tab】(^I)用指定个数的空格替换
join	[-ti12] file1 file2
	-t	默认空格为分隔符,并对比第1栏的数据,若果两文件相同,
		则将两条数据练成一行,且第一个栏位放在第一个
	-i	忽略大小写
	1	阿拉伯数字1,代表第一个文件的第几列作为对比依据
	2	阿拉伯数字2,代表第二个文件的第几列作为对比依据
paste	[-d]
	-d	后面跟分隔符

划分命令:split

split	[-bl]	file PREFIX
	-b num	将文指定文件拆分成多个指定大小的文件
	-l num	将文件才分成多个指定行大小的文件
	PREFIX	可作为才分文件的前缀,多个文件会以PREFIX	为开始,aa、bb、cc结尾

标题参数代换xargs

xargs [-n0ep] command
	-n num	一次给command num个参数
	-e'eod' 遇到参数eod结束命令
		注意:-e'eod' e和'分号之间没有任何字符
	-p	执行每个命令都会提示确认

标题命令历史记录:history

history [-rawcn] [filename]
	-c	清除history记录
	-w	将history记录存储到~/.bash_history中
	-r	将filename中的记录加载到history中
	-a	将history中的记录存储到filename中

~./bash_history 历史shell命令
~/.logout 想让系统在你注销账户后做些什么的命令。

上一篇:Linux安全加固


下一篇:A Child's History of England.8