硬件、内核与shell
我们必须要通过‘shell’将我们输入的命令与内核通信,好让内核可以控制硬件来正确无误地工作。
bash shell的功能
bash的主要优点:
命令记忆能力(history)
命令与文件补全功能(Tab按键)
命令别名设置功能(alias)
作业控制、前台、后台控制(job control,foreground,background)
程序脚本(shell script)
通配符(wildcard)
查询指令是否为bash shell的内置命令:type
指令:type [-tpa] name
type不加参数时,会显示出name是外部指令还是bash内置命令
-t:type会将name以下面这些字眼显示出它的意义:
file:表示为外部命令;
alias:表示该命令为命令别名所设置的名称;
builtin:表示该命令为bash内置命令功能。
-p:后面接的name为外部命令时,才会显示完整文件名;
-a:会由PATH变量定义路径中,将所有含name的命令都列出来,包含alias。
shell的变量功能
变量:简单来说,变量就是一组文字或者符号等,来替代一些设置或者是一串保留的数据。
变量的取用与设定:echo,变量设定规则:unset
变量取用就是利用echo这个指令,在变量名前加上$,或者是以${变量}的方式也是可以的。
变量的设定规则
变量与变量内容以一个等号‘=’来连接;
等号两边不能直接接空格符;
变量名只能为英文字母与数字,且开头字符不能是数字;
变量内容若有空格符可使用双引号或单引号将内容结合起来;
可以用转义字符‘\’将特殊符号(如[Enter],$,\,空格符,!等)变成一般字符;
在一串命令中,还需要通过其他命令提供信息,可以使用反单引号“`命令`”或者“$(命令)”。
若该变量为了增加变量内容时,则可用“$变量名称”或${变量}累加内容;
若该变量需要在其他子进程执行,则需要以export来使变量变成环境变量;
通常大写字符为系统默认变量,自行设置变量可以使用小写字符,方便判断;
取消变量的方法为使用“unset变量名称”。
在变量设置中,单双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有有特殊符号。
环境变量的功能
用env查看环境变量与常见环境变量说明。
PS1:(提示字符的设定)
\d:可显示出“星期 月 日”的日期格式;
\H:完整主机名;
\h:仅取主机名在第一个小数点之前的名字;
\t:显示时间,为24小时格式的“HH:MM:SS”;
\T:显示时间,为12小时格式的“HH:MM:SS”;
\A:显示时间,为24小时格式的“HH:MM”;
\@:显示时间,为12小时格式的“HH:MM”;
\u:目前使用者账号名称;
\v:BASH版本信息;
\w:完整的工作名称目录;
\W:仅列出最后一个目录名;
\#:下达的第几个命令;
\$:提示字符,如果是root时,提示字符为#。
与文件系统及程序的限制关系:ulimit
ulimit [-SHacdfltu] [配额]
-H:严格的设置,必定不能超过这个设置的数值;
-S:警告设置,可以超过,但会发出警告;
-a:后面不接任何参数,可列出所有限制额度;
-f:此shell可以创建的最大文件容量,单位为KB。
变量内容的删除、代替与替换
${变量#关键字}:若变量内容从头开始的数据符合“关键字”,则将符合的最短数据删除;
${变量##关键字}:若变量内容从头开始的数据符合“关键字”,则将符合的最长数据删除;
${变量%关键字}:若变量内容从尾向前的数据符合“关键字”,则将符合的最短数据删除;
${变量%%关键字}:若变量内容从尾向前的数据符合“关键字”,则将符合的最长数据删除;
${变量/关键字}:若变量内容符合“旧字符串”,则第一个旧字符串会被新字符串替换;
${变量//关键字}:若变量内容符合“旧字符串”,则全部旧字符串会被新字符串替换。
命令别名与历史命令
命令别名设置:alias,unalias
例子:
命名alias lm=’ls -l | more’ 和 alias rm=’rm -i’
取消unalias lm 和unalias rm
历史命令:history
history [n]
history [-c]
history [-raw] histfiles
n:数字,列出最近n条命令行;
-c:将目前的shell中的所有history内容全部删除;
-a:将目前新增的history命令新增入histfiles中,若没有加histfiles,则默认写入~/.bash_history;
-r:将histfiles得到内容读到目前这个shell的history记忆中;
-w:将目前的history记忆内容写入到histfiles中。
Bash Shell的操作系统环境
bash的登录与欢迎信息分别在在:/etc/issue和/etc/motd;
/etc/profile(login shell才会读):
这个文件设置的变量主要有:
PATH:会依据UID决定PATH变量要不要含有sbin的系统命令目录;
MAIL:会依据账号设置好用户的mailbox到/var/spool/mail/账号名;
USER:根据用户账号设置此变量内容;
HOSTNAME:依据主机的hostname命令决定此变量内容;
HISTSIZE:历史命令条数;
login-shell:取得bash时需要完整的登录流程的,就称为login shell。举例来说,你要由tty1~tty6登入,需要输入用户的账号和密码,此时得到的bash就称为login shell。
non-login-shell:取得bash接口的方法不需要重复登入的举动,举例来说,(1)你以X Window登入Linux后,再以X的图形化接口启动终端机,此时那个终端接口并没有需要再次的输入账号和密码,那个bash的环境就称为non-login shell了。(2)你在原本的bash环境下再次下达bash这个指令,同样的也没有输入账号密码,那第二个bash(子程序)也是non-login shell。
source:读入环境配置文件的命令
将某配置文件读入目前的bash环境中。
命令:source 配置文件名
终端机的环境设置:stty,set
查阅目前的一些按键内容,且可以帮助设置终端机的输入按键代表的意义。
命令:stty [-a] 指令 按键
-a:将所有的stty参数都列出来。
set可以帮助我们设置整个命令输入/输出的环境。
set [-uvCHhmBX]
-u:默认不启用,启用后,当使用未设置变量时,显示错误信息;
-v:默认不启用,启用后,在讯息被输出前,会先显示信息的原始内容;
-x:默认不启用,启用后,在命令被执行前,会显示命令内容;
-h:默认启用,与历史命令有关;
-H:默认启用,与历史命令有关;
-m:默认启用,与工作管理有关;
-B:默认启用,与括号[]的作用有关;
-C:默认不启用,使用>等时,则若文件存在时,该文件不会被覆盖。
bash默认的组合键
Ctrl+C:终止目前的命令;
Ctrl+D:输入结束(EOF);
Ctrl+M:就是Enter
Ctrl+S:暂停屏幕输入;
Ctrl+Q:恢复屏幕输入;
Ctrl+U:在提示符下,将整行命令删除;
Ctrl+Z:暂停目前命令。
通配符与特殊符号
常用通配符:
*:代表0个到无穷多个任意字符;
?:代表一定有一个任意字符;
[]:同样代表一定有一个在中括号内的字符;
[-]:若有减号在中括号时,代表在编码顺序内的所有字符;
[^]:若括号内的第一个字符为指数符号,那表示原向选择。
常用特殊符号:
\:转义符号,将“特殊字符或通配符”还原成一般字符;
|:管道,分隔两个管道命令的界定;
~:用户的主文件夹;
/:目录符号,路径分隔的符号;
等等还有许多!
数据流重定向
数据流重定向就是将某个命令执行后应该出现在屏幕上的数据传输到其他的地方。
standard output与standard error output:简单来说,标准输出指的是命令执行回传的正确的信息,而标准错误输出可理解为命令执行失败后,所传回的错误信息。
传送所用的特殊字符:
标准输入(stdin):代码为0,使用<或<<;
标准输出(stdout):代码为1,使用>或>>;
标准错误输出(stderr):代码为2,使用2>或2>>。
standard input:<与<<
<:就是将原本需要由键盘输入的数据改由文件内容来替代。
例子:cat > catfile < ~/.bashrc
cat > catfile << “eof”
命令输出重定向的使用情况:
屏幕输出的信息很重要,而且我们需要将它存下来的时候;
后台执行中的程序,不希望它干扰屏幕正常的输出结果时;
一些系统的例行命令的执行结果,希望它可以存下来时;
错误信息与正确信息需要分别输出时等。
命令执行的判断依据: ; ,&& ,||
cmd; cmd
在命令与命令之间利用分号(;)来隔开,这样分号前的命令执行完成后就会立刻接着执行后面的命令了。
$?(命令回传码)与&&或||
命令执行情况:
cmd1&&cmd2:若cmd1执行完毕且正确执行($?=0),则开始执行cmd2;若cmd1执行完毕且为错误($?≠0),则cmd2不执行;
cmd1||cmd2:若cmd1执行完毕且正确,则cmd2不执行;若cmd2执行完毕且为错误,则开始执行cmd2;
假设判断式一般都会是:
command1 && command2 || command3
管道命令(pipe)
管道命令需要注意的地方:
管道命令仅会处理standard output,对于standard error output会予以忽略;
管道命令必须要能够接收来自前一个命令的数据称为standard input继续处理才行。
选取命令:cut,grep
用于分隔字符:cut -d ‘分隔字符’ -f fields;
用于排列整齐的信息:cut -c 字符范围;
-f:依据-d的分隔字符将一段信息切割成为数段,用-f去除第几段的意思;
-c:以字符的单位取出固定字符区间。
cut主要用在将同一行里面的数据进行分解,最常使用在分析一些数据或文字数据的时候。
grep [-acinv] [--color=auto] ‘查找字符串’ filename
-a:将binary文件以text文件的方式查找数据;
-c:计算找到‘查找字符串’的次数;
-i:忽略大小写的不同,所以大小写视为相同;
-n:顺便输出行号;
-v:反向选择,即显示出没有‘查找字符串’内容的那一行;
--color=auto:给关键字部分加上颜色显示。
grep可以解析一行文字,取得关键字,若该行有存在关键字,就会整行列出来。
排列命令:sort,wc,uniq
sort可以依据不同的数据类型来排序。
sort [-fbMnrtuk] [file or stdin]
-f:忽略大小写差异;
-b:忽略最前面的空格;
-M:以月份的名字来排序;
-n:使用‘纯数字’排序;
-r:反向排序;
-u:就是uniq,相同的数据中,仅出现一行代表;
-t:分隔符,默认是用Tab键来分隔;
-k:以那个区间(field)来进行排序。
排序完成之后,将重复的数据仅列出一个显示:
uniq [-ic]
-i:忽略大小写字符不同;
-c:进行计数。
计算文件中有多少字?多少行?多少字符?
wc [-lwm]
-l:仅列出多少行;
-w:仅列出多少字(英文单字);
-m:多少字符。
双向重定向:tee
tee会同时将数据流送与文件与屏幕;而输出到屏幕的,其实就是stdout,可以让下个命令继续处理。
tee [-a] file
-a:以累加的方式,将数据加入file中。
字符转换命令:tr,col,join,paste,expand
tr可以用来删除一段信息当中的文字,或者是进行文字信息的替换。
这个命令也是可以写在正则表达式中的,因为它也是有正则表达式的方式来替换数据的。
tr [-da] SET1 ...
-d:删除信息中的SET1这个字符串;
-s:替换重复的字符。
col命令用于过滤控制字符。
col经常被利用于将man page转存为纯文本文件以方便查阅的功能。
col [-xb]
-x:将Tab键转换为对等的等号;
-b:在文字内有反斜杠(\)时,仅保留反斜杠最后接的那个字符。
join主要是将两个文件当中有相同数据的那一行加一起。
join [-ti12] file1 file2
-t:join默认以空格符分隔数据,并且对比“第一个字段”的数据,如果两个文件相同,则将两条数据连在一行,且第一个字段放在第一个;
-i:忽略大小写的差异;
-1:这个是数字1,代表第一个文件要用哪个字段来分析的意思;
-2:代表第二个文件要用哪个字段来分析的意思。
有点不太懂,回头再仔细研究。。。
相对于join,paste直接将两行贴在一起,且中间以Tab键隔开。
paste [-d] file1 file2
-d:后面可以接分隔字符,默认是以Tab来分隔的;
-:如果file部分写成-,表示来自standard input的数据的意思。
expand就是将Tab转换成空格键。
expand [-t] file
-t:后面可以接数字,一般来说一个Tab按键可以用8个空格键替换,我们也可以自行定义一个Tab按键代表多少个字符。
切割命令:split
split将一个大文件依据文件大小或行数来切割成为小文件。
split [-bl] file PREFIX
-b:后面可接欲切割成的文件大小,可加单位,例如b,k,m等;
-l:以行数来进行切割;
PREFIX:代表前导符,可作为切割文件的前导文字。
参数替换:xargs
xargs [-0epn] command
-0:如果输入的stdin含有特殊字符,这个参数可以将它还原成一般字符;
-e:这个是EOF(End Of File)的意思。后面可以接一个字符串,当xargs分析到这个字符串时,就会停止继续工作;
-p:在执行每个命令的参数时,都会询问用户的意思;
-n:后面接次数,每次command命令执行时,要使用几个参数的意思。
关于减号-的用途:某些情况下,代替stdin和stdout。