您的位置:首页 > 运维架构 > Shell

#4 什么是shell与bash的特性

2017-03-21 11:00 225 查看
Shell:
操作接口,为用户提供简单易用的操作界面,
Bell实验室:bourne shell --> sh
Bill joy:C shell --> csh --> tcsh
David korn:korn shell --> ksh
Gun:bourne again shell --> bash(默认的Linux标准shell)
Zsh:

默认系统中所支持的shell:
~]# cat /etc/shells

bash特性:

一、命令别名(自定义命令)alias(查看别名命令)
alias命令可以用来定义和显示命令的别名。
但是使用alias命令定义的别名,其生命期仅为当前shell的生命期;

对于每个用户来说,都有一个私有的bash配置文件,用于保存别名:
~/.bashrc

注意:
1.alias命令的效果仅限于当前shell的生命期;
2.如果修改.bashrc配置文件,其中保存的别名并不会立即生效,只有在重新加载该文件的内容之后,才会生效,且永久生效;
3.为了能够保证我们设置的别名永久有效,通常两种操作都要做;

撤销别名:
unalias:
unalias:name(别名名称)

二、命令历史:
Bash进程会保存其会话中用户曾经执行过的命令,以方便用户重复执行某个命令;
通过bash提供的历史命令文件来持久保存此前执行过的命令,每个用户都有其自己私有的历史文件;
登录shell的时候,bash会自动读取~/.bash_history文件中所记录的所有命令;

history命令:
-c:清空历史缓冲区中的历史命令;
-d offset:删除特定历史命令条目;

重复执行前一个命令的方法:
1.使用上方向键,回车执行;
2.Ctrl+p,回车执行;
3.!-1,回车执行;
4.!!,回车执行;

重复执行历史缓冲区中的命令:
!#(数字)重复执行历史命令中编号为“#”的命令
!string(字符串):从历史缓冲区中查找最近一次执行过的以“String”开头的命令,并执行;
!?string(字符串):从历史缓冲区中查找最近一次执行过的包含“String”的命令,并执行;
!-#(数字):重复执行历史缓冲区中倒数第“#”条命令;

Ctrl+r:在历史缓冲区中实施搜索,回车执行即可;

重复使用历史命令中的一部分:
!$:表示最后一次命令中最后一个参数;
先按ECS,然后按.:表示最后一次命令中最后一个参数;
Alt+.:表示最后一次命令中最后一个参数;
!^:表示第一个位置的参数
!:#(数字):表示最后一次命令中第“#”个位置的参数;
!#(数字):#(数字):表示在历史缓冲区中第“#”个命令的第“#”个参数
!string(字符串):^|$|*|#:

与历史相关的bash变量:
Histsize;
Histfilesize;
Histtimeformat;
Histtimeformat=“%F %T”(显示时间)
Histcontrol;
ignoredups:忽略连续且相同的命令的历史缓存;
ignorespace:忽略以空白字符开头的命令;
ignoreboth:以上两个功能都启用;

三、快捷键
C-->Ctrl
M-->Alt
E-->Esc
del-->backspace

在命令行模式下使用的快捷键:
C-l:clear,清屏;
C-a:将光标跳转至命令行的行首;
C-e:将光标跳转至命令行的行尾;
c-u:删除光标所在位置至行首的命令行信息;
C-k:删除光标所在位置至行尾的命令行信息;
C-c:结束前台进程,取消命令的运行;

四、命令补全机制:
两个方面的理解:
命令本身的字符串的补全
参数的补全

shell命令的执行过程:
1.Shell会根据用户键入“enter”来判断用户的输入结束;
2.shell会将收集的命令信息,根据空白字符来分段(token),第一分段被理解为命令字段;
3.判断第一字段是内部命令还是外部命令,如果是内部命令,则直接运行,如果是外部命令,通过path变量所指示的路径信息,去查找相关的位置,以确定是否存在同名文件,如果有,就执行;否者就报错;
4.判断选项是否正确,判断参数是否正确;

使用tab键可以完成命令补全:
如果给出的字符串不能作为唯一的标识,则bash不予补全;再次敲击tab键,bash会给出参考列表;如果参考列表中的内容过多,bash会询问是否显示该列表;
根据提供的参数路径来进行补全,如果参数没有任何提示信息,则默认从工作目录进行查找;

五、命令行展开:
~:bash会自动将其展开为当前登录用户的家目录;
~string(字符串):bash会自动将其张开为以“string”为用户名的家目录;
~+:调用shell变量“pwd”的值;
~-:调用shell变量“oldpwd”的值;
{}:在花括号中可以填充一个以“,”分隔的路径列表,bash会将其展开为多个独立的路径

六、命令的执行结果:
任何一个Linux命令都有两种执行结果;
其一:命令的正常输出结果;
跟用户需求相关的返回内容;
``(英文状态下~键):反向单引号,反引号
$():标准的命令引用格式
wc:统计一个文件中的行数、字数及字节数;
-c:只显示字节数;
-l:只显示行数;
-w:只显示字数;

其二:命令的执行状态返回值;
跟命令执行成功与否相关的返回内容;
保存在bash的一个特殊变量中:$?
0:命令执行成功
1,2,127:bash内置状态返回值;
1:表示小问题
2:表示严重问题
127:表示命令本身问问题;
3-126,128-255:用户自定义状态信息;

七、引用功能:
‘’:强引用
凡是被单引号引用的内容,bash一律将其视为普通字符,即便其本身有特殊功能和作用也是如此。但单引号本身是个例外。
“”:弱引用
被双引号引用的内容中,有些特殊字符仍然会保留其特殊含义,比如说:$、\、”

八、转义功能:
\:bash中定义的转义字符:只能使其后一个字符失去特殊意义;

九、Globbing(文件名通配,简称为glob):
元字符(基本字符):
*:匹配任意长度的任意字符,某些特殊位置的“.”字符不能被匹配;
?:匹配任意单个字符,必须且只有一个字符被匹配;
[]: 匹配指定范围内的任意单个字符,必须且只有一个字符被匹配
在“[]”中范围的显示的模式:
[a-z]:a,A,b,B,c,C...y,Y,z
[A-Z]:A,b,B,c,C…y,Y,z,Z
字符集:
[:lower:]:表示所有小写字字母;
[[:lower:]]:通配任意单个小写字母;
[:upper:]:表示所有的大写字母;
[[:upper:]]:通配任意单个大写字母;
[:alpha:]:表示所有字母字符;
[:digit:]:表示所有的十进制数字 10
[:alnum:]:表示所有的大小写字母以及十进制数字
[:space:]:表示空白字符
[:punct:]:表示所有的标点符号
^: 取反匹配,[^]表示不要的意思

十、输入输出重定向:
在使用计算机的时候,实现某种功能的主题是:程序
程序=指令+数据
数据:文件,io
可以用于输入的设备:文件
键盘文件、文件系统中的常规文件、网卡设备、声卡设备等;
可以用于输出的设备:文件
显示器、文件系统中的常规文件、网卡设备、声卡设备等;

每一种程序都有三种形式的数据流:
输入数据流:为程序获取数据的数据流;默认的输入数据流的来源就是键盘;
输出数据流:将程序所处理的数据结果展示给用户的数据流;默认的输出数据流的终点是显示器;
错误数据流:将程序无法处理或处理过程中出现问题的结果展示给用户的数据流:默认的错误数据流的终点是显示器;

从键盘实现的输入数据流称为标准输入;
到显示器上的输出数据流称为标准输出;
到显示器上的错误数据流称为标准错误输出,简称标准错误;

文件描述符:file descriptor,简称:FD
0:标准输入,stdin
1:标准输出,stdout
2:标准错误,stderr

IO重定向:采用非标准设备文件实现的IO操作;

简单来说:
不是从键盘设备完成的数据流输入就可以称为输入重定向或重定向输入;
不是到显示器设备的正确输出数据流就被称为输出重定向或重定向输出;
不是到显示器设备的错误输出数据流就被称为错误重定向或重定向错误;

>:覆盖输出重定向
~]# set -C //开启防误覆盖开关
在此开关开启后,可以使用“>”符号继续覆盖重定向
~]# set +C //关闭防误覆盖开关
>>:追加输出重定向

错误重定向:
2>:覆盖错误重定向;
2>>: 追加错误重定向;

合并标准输入和标准输出的重定向:
1)&>,&>> (4.0以上的bash才支持的符号)
2)command >|>> path/to/somefile 2>&1

/dev/null:blackhole,bitbucket(位桶 垃圾桶),

Ls /tmp/a.txt &> /dev/null
||(等号)
Ls /tmp/a.txt > /dev/null 2>&1

输入重定向:
<:

<<:here document(此处文档)
<<<:here string(此处字符串)

十一、管道

|:
Command1 | command2 | command3 | ...
注意:所有的用于管道连接的命令,都应该是能够有标准输出数据流的命令;

tee:T

十二、变量
变量:一段连续的内存空间,cell--8bit,为这一段内存空间取名,称为变量名;在这段内存空间中所储存的数据,称为变量值;

赋值操作:
=:赋值操作符
赋值方法:VARNAME=VALUE(中间不能加括号)

VARNAME的命名规范:
1.只能以字符或“_”为首字符,不能使用数字,后面可以使任意字母、数字和下划线;
2.大小写严格区分:
3.见名知意;
4.书写规范;
1)全大写:FILES
2)驼峰式:Myfiles
5.不能与已知变量名相同

根据不同的编程语言,变量可以分为两类;
强变量:
必须在使用前先声明,而且要声明其类型,严格区分变量类型;
255
字符类型:3Bytes
整数型:1Bytes 11111111
null
弱变量:可以随时使用随时声明,甚至可以不声明即使用;不对变量类型做硬性要求,如果没有指明变量类型,统一按照字符型对待;

bash的变量即为弱变量;
python

应用变量的值:$(VARNAME)==>$VARNAME,也称为变量替换;

bahs的变量种类:
全局标量(环境变量):作用范围是整个shell进程,包括其子shell;
本地变量:作用范围仅仅只是当前登录的shell,不包含子shell;
局部变量:作用范围仅仅只是当前的程序段,一般用于函数;
默认全局变量:
位置参数变量:$1,$2,$3,...$n
特殊变量:
$?,$#,$*,$@,$$,...
$?:展开为最近一次所执行的命令的状态返回值(退出状态);
$#:位置参数的个数,以十进制表示;
$*:从1开始展开为位置参数。当使用双引号引用展开的时候,它展开为以特殊变量“IFS”的第一个字符分隔的值
$@:从1开始展开为位置参数。当使用双引号引用展开的时候,它展开为一个单独的字符串;
$$:展开为当前shell的进程标识服;
$0:展开为shell或者shell脚本的文件名;

变量的使用:
声明本地变量;
变量的赋值:VARNAME=VALUE,
撤销变量:~]# unset VARNAME

声明环境变量:
export VARNAME
export VARNAME=VALUE

declare
-a:声明索引数组(如果支持);
-A:声明关联数组(如果支持);
-i:声明整型变量;
-l:声明变量并将变量值中的字母转换为小写字母;
-u:声明变量并将变量值中的字母转换为大写字母;
-x:声明变量并将其导出为环境变量;
-r:声明变量为只读变量(常量);

查看环境变量:
set:
export:
enV:

声明局部变量:
local VARNAME=VALUE

配置文件:
通用配置文件:/etc/bashrc、/etc/profile
私人配置文件:~/.bashrc、~/.bash_profile

注意:一般情况下,声明变量都是现做现用,并不需要改配置文件;

十三、bash的特性之多命令执行;
~]# COMMAND1 $(COMMAND2)
~]# COMMAND1|COMMAND1...进程之间通信(IPC)
顺序执行结构:
~]# COMMAND1;COMMAND2;...
选择执行结构:
逻辑运算:
与:逻辑乘法,&&,双目运算符
0:SUCCESS --> true(真)
1-255:FAILURE --> false(假)

true && true = true
true && false = false
false && true = false
false && false = false

“与”的短路逻辑运算:只要第一个操作数为false,则其逻辑运算的结果一定为false;

COMMAND1 && COMMAND2
如果COMMAND1能够成功执行,则COMMAND2会被执行;
如果COMMAND1执行失败,则COMMAND2不会被执行;

! COMMAND1 && COMMAND2
如果COMMAND1能够成功执行,则COMMAND2不会被执行;
如果COMMAND1执行失败,则COMMAND2会被执行;

或:逻辑加法,||,双目运算符
true || true = true
true || false = true
false || true = true
false || false = false
“或”的短路逻辑运算;只要第一个操作数为true,则其逻辑运算的结果一定为true;

COMMAND1 || COMMAND2
只要COMMAND1能够成功执行,COMMAND2就没有必要执行了;
只有当COMMAND1执行失败的时候,COMMAND2才会被执行;

! COMMAND1 || COMMAND2
如果COMMAND1能够成功执行,则COMMAND2会被执行;
如果COMMAND1执行失败,则COMMAND2不会被执行;

非:逻辑取反,!,单目运算符
!STRING:读取命令历史空间的内容;

! true = false
! false = true

! COMMAND

! COMMAND1 && COMMAND2 相对于 COMMAND1 || COMMAND2
! COMMAND1 || COMMAND2 相对于 COMMAND1 && COMMAND2

德摩根丁璐:
! (A && B) == ! A || ! B
! (A || B) == ! A && ! B

逻辑运算符号优先级:
! > &&> ||

异或:双目运算符
比对两个操作数是否不同;如果不同,则逻辑运算结果为真;如果相同,则逻辑运算结果为假;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息