什么是shell?
shell 将我们输入的命令与内核进行沟通,好让内核可以控制硬件来正确无误地工作。
type [-tpa] name 查看命令是否是内置命令
type [-atp] name
-a 将PATH变量定义的路径中,所有包含name的命令都会列出,包括alias
-t
file 表示外部命令
alias 表示该命令为别名所设置的名称
builtin 表示bash内置命令
-p 如果是外部命令,打印出完整的文件名
命令行快速编辑按钮
变量
【y=ax+b】等号左边的(y)就是变量,等好的右边(ax+b)就是变量内容。左边是未知数,右边是已知数。
变量又可以分为“环境变量”和“局部变量”,类似于小孩子的存款和父亲的存款,小孩子比较贪财,自己的钱谁也拿不走一分,但他爸爸的钱小孩子却有直接的继承关系。
也就是父类的变量子类可以使用,子类的变量,只有子类可以使用。
变量设置的规则:
- 变量只能是字母或数字,但只能字母开头
- 变量与变量之间用“=”号连接
- 使用变量时使用"${name}"来获得变量的值
- 双引号内保留变量符号的属性
- 单引号内所有字符均为一般字符(纯文本)
- 【\】为转义字符
- 在一串命令中,使用【KaTeX parse error: Can't use function '\`' in math mode at position 9: (子命令)】或【\̲`̲子命令\`】来使用子命令,会优…()中的命令
- 若该变量为扩增变量时,需要时使用“ 变 量 名 ” 或 变量名”或 变量名”或{变量名}累加内容
- 系统默认变量使用的全部都是大写字母,自行设置变量可以使用小写字母
- 其他程序想使用“子变量”,可以在子变量中使用export 子变量名将该变量变为环境变量。
- 使用“uset”来设置取消变量
注意:变量分为未定义变量和“”变量
查看环境变量
env 或 export
set用来查看环境变量和自定义变量
其中set查看的变量中有一个变量为【SP1】,该变量参数:
$? 表示上一命令执行结果,成功$?值为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 :限制用户打开的文件个数
变量内容的替换、删除与取代
#:符合取代文字的『最短的』那一个;
##:符合取代文字的『最长的』那一个
变数设定方式 说明
${变数#关键字} 若变数内容从头开始的资料符合‘关键字’,则将符合的最短资料删除
${变数##关键字} 若变数内容从头开始的资料符合‘关键字’,则将符合的最长资料删除
${变数%关键字} 若变数内容从尾向前的资料符合‘关键字’,则将符合的最短资料删除
${变数%%关键字} 若变数内容从尾向前的资料符合‘关键字’,则将符合的最长资料删除
${变数/旧字串/新字串} 若变数内容符合‘旧字串’则‘第一个旧字串会被新字串取代’
${变数//旧字串/新字串} 若变数内容符合‘旧字串’则‘全部的旧字串会被新字串取代’
例如:
[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
命令查找的顺序:
- 以相对/绝对路径执行命令。
- 以alias找到该命令执行
- 由bash内置的(builtin)命令执行
- 通过$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读取流程:
下面的则是调用的配置文件。
如果修改了.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通配符:
特殊符号:
数据重定向:
注意:当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 想让系统在你注销账户后做些什么的命令。