只要能够操作应用程序的接口都能称为shell。狭义的shell指的是命令行方面的软件,包括bash。广义的shell则包括图形界面软件,因为图形界面其实也可以操作各种应用程序来调用内核工作,不过,在这里我们主要指的是bash。
#type[-tpa]command–>查看命令是否为bash的内置命令或者是外部命令
*利用$var或者是${var}可获取变量var的值
*bash中的双引号:特殊字符如$等,可以保有原本的特性
*bash中的单引号:所有的字符均为普通的字符,没有其他含义
*可以用\将特殊字符变成一般字符
*可用$(其他命令)来在命令中嵌套其他命令的返回值,也就是说:${var}取得变量var的值,$(command)取得命令返回值
*若变量需要在其他子进程中执行,需要exportvar来使变量成为环境变量
*unsetvar可取消变量var的定义
====环境变量====
#env–>查看当前系统的环境变量
$本身也是一个变量,表示本shell的PID号,比如#echo$$输出本shell的PID
?本事也是一个变量,表示上一个执行的命令的返回值,一般如果是0表示执行成功,如果非0表示有问题。
公共的语系编码设置:/etc/sysconfig/i18n
#read[-pt]variable–>键盘读取变量输入值
-p:后面可以跟提示符
-t:后面可以接等待的秒数,不会一直等待用户输入
====变量的声明====
#declare[-aixrp]var
-a:将后面的var定义为数组类型
-i:将后面的var定义为integer整数类型
-x:用法与export一样,就是将后面的var变成环境变量
-r:将变量var设置成readonly状态,该变量不能被更改,也不能重设
-p:单独列出变量的类型
如果把-改成+表示取消操作
====限制用户的计算机资源使用====
#ulimit[-SHacdfltu][配额]
-H:hardlimit,严格的限制,必定不能超过这个数值
-S:softlimit,可以超过这个值,但有警告信息
-a:后面不接任何参数,列出所有的限制额度
-c:某些进程发生错误的时候,系统会将该进程在内存中的信息写成文件,称为内核文件。限制每个内核文件的最大容量
-f:此shell可创建的最大单一文件容量,单位为KB
-d:进程可以使用的最大内存量
-l:可用于lock的内存量
-t:最大的CPU时间(单位为秒)
-u:单一用户可使用的最大进程(process)数量
====变量内容的删除与替换====
#echo${path#/*:}–>删除path变量中最前面的那个以/开头,以:结尾的
#echo${path##/*:}–>删除最长的那个,也就是说只保留了最后的一个路径
#–>符合替换文字的最短的那个
##–>符合替换文字的最长的那个
如果想从后面开始删,用%替换#即可
接下来讲替换功能:
#echo${path/sbin/SBIN}–>将第一个sbin替换成SBIN
#echo${path//sbin/SBIN}–>将所有的sbin替换成SBIN
我们将这部分总结说明下一下:
变量设定方式 | 说明 | ${变量#关键字} ${变量##关键字} | 若变量內容从头开始的数据符合『关键字』,则将符合的最短数据删除 若变量內容从头开始的数据符合『关键词』,则将符合的最长数据删除 |
${变量%关键字} ${变量%%关键字} | 若变量內容从尾向前的数据符合『关键字』,则将符合的最短资料删除 若变量內容從尾向前的数据符合『关键字』,则将符合的最長资料删除 |
${变量/旧字串/新字串} ${变量//旧字串/新字串} | 若变量內容符合『旧字串』則『第一個旧字串会被新字串取代』 若变量內容符合『旧字串』則『全部的旧字串会被新字串取代』 |
#username=${username:-root}–>如果username非空就取原值,如果没有设置或者为空字符串就设置成root
====bash登录界面与登录成功后的欢迎界面====
tips:最好是单一bash登陆,然后利用jobcontrol来切换不同的工作,这样的话shell的history才能完全保存下来
命令的执行搜索路径顺序:先alias,再builtin,再$PATH
bash的登陆界面配置文件:/etc/issue,远处登陆界面配置文件:/etc/issue.net
命令#manmingetty查看issue中各个代码的意义
登陆成功后显示的信息配置文件:/etc/motd
====bash环境变量====
loginshell的配置文件:
/etc/profile:系统全局配置文件,最好不要修改这个文件
~/.bash_profile或者~/.bash_login或者~/.profile:用户自定义bash配置文件
~/.bashrc,这个配置文件loginshell和non-loginshell都会读取
====bash中的通配符和特殊字符====
符号 | 意义 | *代表『0个到无穷多个』任意字符 |
?代表『一定有一个』任意字元 |
[]同样代表『一定有一个在括号內』的字元(非任意字元)。例如[abcd]代表『一定有一个字元,可能是a,b,c,d这四个任何一个』 |
[-]若有减号在中括号内时,代表『在编码顺序內的所有字元』。例如[0-9]代表0到9之间的所有数字,因为数字的语系编码是连续的! |
[^]若中括号內的第一个字元为指数符号(^),那表示『反向选择』,例如[^abc]代表一定有一个字元,只要是非a,b,c的其他字元就接受的意思。 |
除了通配符之外,bash環境中的特殊符號有哪些呢?底下我們先汇整一下:
符号 | 內容 | #注释符号:这个最常被使用在script当中,视为说明#在后的语句均不执行 |
\跳脱符号:將『特殊字符或万用字符』还原成一般字元 |
|管道(pipe):分隔两个管道命令的界定(后两节介紹); |
;连续指令下达分隔符:连续性命令的界定(注意!与管道命令不相同) |
~使用者的家目录 |
$取用变量前置字元:亦即是变量之前需要加的变量取代值 |
&工作控制(jobcontrol):将指令变成背景下工作 |
!逻辑运算意义上的『非』not的意思! |
/目录符号,路径分割符号 |
>,>>数据流重导向:输出导向,分別是『取代』与『累加』 |
<,<<数据流重导向:输入导向(这两个以后说明) |
‘‘单引号,里面全是普通字符,不具备变量置换功能 |
具有变量置换的功能! |
``两个『`』中间为可以先执行的指令,亦可使用$() |
()在中间为子shell的起始与结束 |
{}在中间为命令区块的組合! |
====数据流重导向====
1,标准输入(stdin):代码为0,使用<或者<<
2,标准输出(stdout):代号为1,使用>或者>>
3,标准错误输出(stderr):代号为2,使用2>或者2>>
>表示清空后添加,>>表示累加添加,append的意思。了解?o(╯□╰)o
<表示原本由键盘输入的改由文件输入,而<<则表示遇到后面的字符串的时候结束输入。
/dev/null:超级黑洞,它会吃掉任何导向到它的数据流,很强大的,不是麽。
正确和错误输出到同一个文件的语法格式:
find/home-name.bashrc>list2>&1
====管道命令====
管道命令需要注意的是:
1,管道命令仅能处理standardoutput,对于stderr会忽略掉
2,管道命令必须要能够接受来自前一个命令的数据成为standardinput继续处理才行
====选取命令cut和grep====
#cut-d‘分割字符’-ffields<==用于分割字符
#cut-c字符范围<==用于排列整齐的信息
-d:后面接分割字符,与-f一起使用
-f:依据-d的分割字符将一段信息切割成为数段,用-f取出第几段的意思(-f3,5)
-c:以字符的单位取出固定字符区间(-c12-34)
grep以行为单位分析信息,如果该行符合条件,则把该行提出出来
#grep[-acinv][--color=auto]’查找的字符串’filename
-a:将binary文件以text文件方式查找
-c:计算找到’查找的字符串’的次数
-i:忽略大小写
-n:顺便输出行号
-v:反向选择,即显示出没有‘字符串’内容的那些行
–color=auto:关键字加上颜色
====排序命令sort,wc,uniq====
#sort[-fbMnrtuk][fileorstdin]
-f:忽略大小写
-b:忽略最前面的空格
-M:以月份的名字排序
-n:使用数字排序(默认是文字来排序)
-r:反向排序
-u:就是uniq,相同的数据中,仅出现一行代表
-t:分隔符,默认以TAB分割
-k:以那个区间进行排序
#cat/etc/passwd|sort-t:-k3<==以第三列进行排序
#last|cut-d‘‘-f1|sort
#uniq[-ic]<==排序完成后将重复的数据仅列出一个显示
-i:忽略大小写
-c:进行计数
#last|cut-d‘‘-f1|sort|uniq-ic
#wc[-lwm]<==行数,字数,字符数统计命令
-l:仅列出行
-w:仅列出多少字(英文单词word)
-m:多少字符(char)
#cat/etc/man.config|wc
====双向重定向tee====
#tee[-a]file
-a:以累加(append)方式,将数据加入到file中
#ls-l/home|tee-a~/homefile|more
====字符转换命令:tr,col,join,paste,expand====
#tr[-ds]SET1
-d:删除信息中的SET1这个字符串;
-s:替换掉重复的字符
#last|tr-s‘[a-z]‘‘[A-Z]‘
#cat/etc/passwd|tr-d:
#col[-xb]
-x:将tab键转换成对等的空格键
-b:如果在文字内有反斜杠(\),仅保留反斜杠最后接的字符
#join[-ti12]file1file2
-t:join默认以空格符分割数据,并且对比第一个字段的数据,如果相同,合并到一行,且第一个字段放在第一个
-i:忽略大小写
-1:代表第一个文件要用那个字段来分析
-2:代表第二个文件要用哪个字段来分析
#join-t:-14/etc/passwd-23/etc/group
#paste[-d]file1file2
-d:后面可以接分割字符,默认以tab来分割
-:如果-file写成-,则表示来自stdin的数据
#expand[-t]file
-t:后面接数字,表示一个tab键可以转换成几个空格键
#grep‘^MANPATH’/etc/man.config|head-n3|expand-t6–|cat-A
====切割命令split====
#split[-bl]-filePREFIX
-b:后面接欲切割成的文件的大小,可以加单位,如b,k,m,g等
-l:以行数进行切割
PREFIX:前导符,可作为切割文件的前导文字
#split-b300k/etc/termcaptercap
====参数代换xargs====
#xargs[-0epn]command
-0:如果输入的stdin含有特殊字符,比如`,\,空格键等,这个参数可以将其还原成一般字符
-e:EOF,后面可以接一个字符串,当xargs遇到这个字符串的时候,就停止继续工作
-p:每次执行命令的参数时,询问用户
-n:后面接次数,每次command执行时,要使用几个参数的意思
#cut-d‘:’-f1/etc/passwd|xargs-p-n5finger
使用xargs的原因是:很多命令其实不支持管道命令,因此我们可以通过xargs来提供该命令引用stdin之用。
#find/sbin-perm+7000|xargsls-l<==找出/sbin下具有特殊权限的文件名
===============END====================