Open jinhucheung opened 8 years ago
硬件/内核/Shell三者关系如下图:
就是说:Shell是一个应用程序,解析用户输入(点击鼠标/键盘)的命令,然后去调用相应的应用程序完成功能
一个Linux下支持多种的Shell,它们在/etc/shells这个文件中
/bin/sh (第一个流行的Shell,已被Bash代替)
/bin/bash (兼容sh,Linux默认的Shell)
/bin/tcsh (整合C shell)
/bin/ksh (兼容Bash)
系统会为每个登陆的用户指定一个Shell,当然也有no-login的Shell,我们可以在/etc/passwd中查看到用户指定的Shell
当我们在终端执行命令时,命令可分为alias别名命令,bash内置命令,外部程序
我们可以使用type 命令名
查看此命令的类型
变量的显示 : echo echo $varname 或者 echo ${varname}
.
变量的设置规则
- 变量与变量值以一个等号"="连接,如
var=value
- 等号两边不能直接接空格,如
var= value
(错误的)- 变量名只能是英文或数字,不能以数字开头
- 变量值若有空格可以用""或''括起来,其中""保持特殊字符的原本特性,''则将特殊字符视为一般字符
- 可以使用转义字符"\"转义特殊字符
- 如要定义变量时引用另一个变量的值,如
path="$path:other"
或path=${path}:other
- 定义变量时引用命令处理结果,可以使用$(command)
- 环境变量(子进程可以使用的变量,通过bash开启子进程)用export来定义变量
- 自定义变量名用小写,系统变量用大写
.
变量的取消: unset varname
变量分为一般变量与环境变量,环境变量可以在子进程中引用,也叫全局变量.
当启动一个Shell,操作系统会分配一个内存记录块给Shell的进程维护.
进程使用export
,将一般变量写到其的内存记录块中.
当启动子进程,子进程将父进程的内存记录块中的信息导入自己的环境变量块中.
我们使用export
将一般变量转出环境变量
bash
启动子进程后,父进程会sleep
查看环境变量 : env
- HOME : 用户主文件夹
- SHELL: 用户使用的Shell
- HISTSIZE: 历史命令条数
- PATH : 执行文件查找路径
- LANG : 语系
- RANDOM: 生成随机数
.
查看所有变量(含环境变量及自定义变量) : set
- PS1 : 命令提示符
- $ : 关于此Shell的PID
- ? : 上个命令的回传码,0表示执行成功
- - : 被unset的变量
- OSTYPE: 操作系统类型
- HOSTTYPE: 主机架构,i686 x86_64等
.
查看系统当前支持的语系 : locale
- 如果用户需要设置shell的语系,可以设置LANG或LC_ALL的值(注销后失效)
- 如果要设置系统的语系,需要在/etc/sysconfig/i18n(CentOS)或/etc/default/locale(ubuntu)设置
变量值键盘读取 : read
- 格式 : read [-pt] varname
p
: 接提示符t
:等待时限
.
声明变量类型: declare/typeset
- 格式: declare [-aixr] varname
a
定义数组变量i
定义整型变量x
定义环境变量r
定义readonly变量
注意: 我们读取数组变量值时,需要使用${varname[1]},${varname[2]}这种格式(所以我们读取变量时最好习惯成${varname})
变量值的删除与替换设置方式如下表
变量设置方式 | 说明 | 备注 |
---|---|---|
${变量#关键字} | 若变量值从头开始的数据,则将符合的最短数据删除 | 从头开始,最短匹配 |
${变量##关键字} | 若变量值从头开始的数据,则将符合的最长数据删除 | 从头开始,最长匹配 |
${变量%关键字} | 若变量值从尾开始的数据,则将符合的最短数据删除 | 从尾开始,最短匹配 |
${变量%%关键字} | 若变量值从尾开始的数据,则将符合的最长数据删除 | 从尾开始,最长匹配 |
${变量/旧字符/新字符} | 将变量值中第一个符合旧字符的数据替换 | 第一个替换 |
${变量//旧字符/新字符} | 将变量值中全部符合旧字符的数据替换 | 全部替换 |
测试变量值的测试方式如下表
变量设置方式 | var没有设置 | var为空字符 | var已设置非空字符 |
---|---|---|---|
testvar=${var?tipstr} | 将tipstr输出至stderr | testvar= | testvar=var |
testvar=${var:?tipstr} | 将tipstr输出至stderr | 将tipstr输出至stderr | testvar=var |
命令别名: alias
- 查看当前系统内的别名命令 :
alias
- 设置别名命令 :
alias name=commad
- 取消别名命令 :
unalias name
.
历史命令: history
- 列出目前内存中的历史命令 : hitory ([-n]:表示最近n条命令)
- 历史命令默认保存在~/.bash_history中,最大保存$HISTSIZE条,当Shell注销时,就会将内存中的历史命令写入~/.bash_history(强制写入hitory -w)
/etc/issue
记录Bash的欢迎信息
/etc/issue.net
记录远程Bash的欢迎信息
/etc/motd
记录用户登录后提示的信息
我们需要将设置好的环境(如命令别名,自定义变量)写入到bash的环境配置文件中才能持久生效,否则在注销后都会失效.
那要写入到哪个bash的环境配置文件? bash分为"login shell" 与"non-login shell",两者读取的环境配置文件有差异,如下图所示:
当我们需要设置bash环境时,可以在~/.bashrc中设置
其他的bash配置文件:
常用通配符如下表:
符号 | 意义 |
---|---|
* | 代表0到无穷多个任意字符 |
? | 一定有1个任意字符 |
[] | 代表一定有一个[]内的字符 |
[-] | 代表编码顺序内的所有字符 |
[^] | 代表含有非[]内的字符 |
bash的特殊符号如下表:
符号 | 意义 |
---|---|
# | 注释符号 |
\ | 转义符号 |
; | 连续命令执行分隔符 |
~ | 用户主目录 |
$ | 变量前导符 |
& | 作业控制,将命令变成后台工作 |
! | 逻辑非 |
/ | 目录符号 |
>,>> | 数据重定向,输出导向,分别是'替换'与'累加' |
<,<< | 数据重定向,输入导向,<<后接一个尾符,表示遇到此尾符,结束输入 |
'' | 单引号,特殊字符转为一般字符 |
"" | 双引号,特殊字符保持殊性 |
`` | 先执行的命令,可使用$()代替 |
{} | 命令块组合 |
当我们执行一个命令是输出结果信息或错误信息都是输到屏幕上的,这两个流我们称为标准输出(stdout)与标准错误输出(stderr),此外还有一个从文件读入数据的流称为标准输入(stdin)
可是当我们想将输出信息输出到文件时,此时不能使用stdout/stderr流,我们需要将它们导向,故称为数据重定向
数据重定向的特殊字符规则如下:
例子:
ll / > ~/rootfile
(文件不存在,会自动创建)find /home -name .bashrc >> ~/rootfile
ll filename 2> /dev/null
ll filename > ~/rootfile 2>&1
cat > ~/rootfile < ~/.bashrc
cat > ~/rootfile <<"eof"
当我们有一批命令需依次执行时,需要判断命令执行的次序.
;
分隔命令cmd1&&cmd2
表示cmd1正确执行($?=0)时,才会执行cmd2cmd1||cmd2
表示cmd1正确执行($?=0)时,就不会去执行cmd2管道命令仅能处理stdout流传来的数据,对于stderr流会忽视,其将前一个命令的stdout流作为stdin输入,处理加工后再作为stdout输出,其中管道命令中用-
表示stdin或stdout
cut
: 选段命令(先分段)
cut -d '分隔符' -f num -c 字符范围
(num是段号 字符范围表示第几个字符到第几个字符,通常分段后,不用c)echo $PATH | cut -d ":" -f 1
grep
: 正则选行命令,利用正则分析一行的数据,满足则选择
grep [-acinv] 查找字符 filename
a
将二进制文件以文本文件方式查找c
统计满足查找字符的次数i
忽视大小写n
输出行号v
反向选择last | grep 'root'
sort
: 排序命令
sort [-fbnrutk] file或stdin
f
忽略大小写b
忽略最前面空格n
比较数值进行排序r
反向排序u
uniq 唯一行t
分隔符k
进行比较的分隔区间cat /etc/passwd | sort -t ':' -k 3
wc
: 统计命令
l
列出行数m
列出字符数w
列出单字数uniq
: 唯一命令
uniq [-ic]
i
忽略大小写c
进行计数tee
可以将stdout转存到文件,并以同样的数据往下传递(即 tee可以将数据同时流向文件和屏幕)
例子:将用户登录信息存到last.list并显示在屏幕上
last | tee ~/last.list | more
tr
: 字符串删除与替换,默认是替换,加-d
表示删除字符col
: 将[TAB]转换为空格键expand
: 将[TAB]转换为空格join
: 比较两个文件,并将其比较字段相同的行,拼接在一起paste
: 将两个文件的每一行对于行号,拼接在一起split
: 可以将一个文件切割成多个小文件
split [bl] file PREFIX
b
切割小文件的大小,单位可是b,k,ml
以行数来切割文件PREFIX
小文件的前缀文件名split -b 5M file1 a
cat a* > file1
xargs
: 将stdin流分隔成参数给其他命令执行(使得这些命令可以在管道后处理)
find /sbin -perm +7000 | xargs ls -l
Index