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

bash特性

2016-03-06 19:56 344 查看
bash是弱类型的编程语言,不严格区分数据类型,意味把所有数据统统当作字符串处理;字符串类型的数据可不加引号。
引号有三种类型:', ", `
', ":字符引用
': 强引用,其内部的变量不会被替换;
":弱引用,其内部的变量会被替换;
`:命令引用

变量引用:${NAME}

bash的特性
一、命令别名
获取当前用户可用的别名的定义 ~]# alias
定义别名 ~]# alias NAME='COMMAND'
生命周期 当前shell进程;
撤消别名 ~]# unalias NAME
如果别名与命令名相同时,直接调用原命令,而非别名,可使用"\COMMAND"
二、命令历史
shell进程会保存其会话中用户曾经执行过的命令;命令通过其“历史文件”来持久保存此前执行过的命令;每个用户都有其自己专用的历史文件。

HISTSIZE:shell进程的缓冲区保留的历史命令的条数;
HISTFILESIZE:命令历史文件可保存的历史命令的条数;
默认均为1000
HISTFILE:当前用户的命令历史文件; // ~/.bash_history
查看命令历史列表:
~]# history

命令用法:
history
-c:清空命令历史
-d:删除指定的条目
-a:将当前缓冲的历史行追加到历史文件中
-n:从历史文件中读取所有未被读取的行
-r:读取历史文件并将内容追加到历史列表中

调用命令历史列表中的命令以重执行之目的:
!#:再一次执行历史列表中的第#条命令;
!!:再一次执行上一条命令;
!STRING:再一次执行命令历史列表中最近一个以指定的STRING开头的命令;

调用上一条命令的最后一个参数:
快捷键:ESC, .
Alt+.
!$:给出的字符组合

显示最近的n条件命令历史:
history n //n=NUM

控制命令历史的记录方式:
通过HISTCONTROL环境变量进行,其取值:
ignoredups:忽略重复的命令;重复是指连续且相同的命令; ignorespace:以空白字符开头的命令不记入历史;
ignoreboth:上述两者同时生效;

修改变量值的方式:
NAME='VALUE'
三、快捷键
Ctrl+a:跳至命令行首;
Ctrl+e:跳至命令行尾;
Ctrl+k:删除光标所在处至尾部的内容;
Ctrl+u:删除行首至光标所在处的内容;
四、命令和路径补全
命令补全
shell程序在接收到用户执行命令的请求且分析完成之后,最左侧字符串将被当作命令去查找;
查找机制:
(1) 查找内部命令;
(2) 查找外部命令:
去$PATH变量所指定的各路径下,自左而右逐个搜索各目录下的文件名;
给定的打头的字符串如果能惟一标识某命令程序文件的文件名,则直接补全;
不能惟一标识,再击tab可给列表;
错误:没有任何命令可被此打头字符串标识;

路径补全:
在给定的起始路径的上级目录下,以对应路径下的打头字符串来逐一匹配上级目标下的每个文件:
惟一标识:tab补全;
不能惟一标识:tab, tab给出列表;
错误路径:没有响应;
五、命令行展开
把命令行的给定的特殊符号自动替换为相应字符串的机制;

~: 自动替换为用户家目录;
~USERNAME:自动替换为指定用户的家目录;

{}:可承载一个以逗号分隔的路径列表,能够将其展开为多个独立路径;
例如:/tmp/{x,y,z} = /tmp/x /tmp/y /tmp/z
/tmp/{x/y, m/{m,n}} = /tmp/x/y /tmp/m/m /tmp/m/n
/tmp/{x,y}/z = /tmp/x/z /tmp/y/z
六、命令的执行状态结果
命令的正常输出结果:命令的返回值;
通过引用来保存下来或直接调用——”命令引用“
`COMMAND`
$(COMMAND)

bash用一个特殊变量来保存最一次执行的命令的状态结果:
$?
命令的执行状态结果:
成功:0
失败:1-255
bash用整数来表示;

bash中的引用:
'':强引用
"":弱引用
``:命令引用
七、glob
glob:文件名通配;快速引用多个文件;文件名整体匹配度检测;
元字符:基于元字符可编写匹配模式(pattern);
*:匹配任意长度的任意字符;
p*,pa*,*p,*p*a
举个栗子 p*:pa, p

?:匹配任意单个字符;
p?, p?a, p??
举个栗子 p??: pa, pad,

[ ]:匹配指定集合内的任意单个字符;
[a-z], [A-Z]:不区分字符大小写;
[0-9]
[a-z0-9]
[[:upper:]]:所有大写字母;
[[:lower:]]:所有小写字母;
[[:digit:]]:所有的数字;
[[:alpha:]]:所有字母;
[[:alnum:]]:所有字母和数字;
[[:space:]]:空白字符;
[[:punct:]]:标点符号;

[^ ]:匹配指定集合外的任意单个字符;
[^[:alpha:]]

for example:
(1)显示/etc目录下,以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录;
ls -d /etc/[^[:alpha:]][a-z]*
(2)复制/etc目录下,所以n开头,以非数字结尾的文件或目录至/tmp/etc目录下;
mkdir /tmp/etc
cp -r /etc/n*[^0-9] /tmp/etc/
(3)显示/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录;
ls -d /ur/share/man/man[0-9]
(4)复制/etc目录下,所以p,m,r开头的,且以.conf结尾的文件或目录至/tmp/conf.d目录下;
mkdir /tmp/conf.d/ //需要先建立目录
cp -r /etc/[pmr]*.conf /tmp/conf.d/
八、变量
程序:指令+数据
数据:文件、变量;

变量:内存空间,有名称,名称即为变量名,对应的内存空间中的数据即为变量的值;

变量赋值:NAME=VALUE
=:赋值符号;
把VALUE存储到NAME指向的内存空间中;

编程语言:
强类型:严格区分变量中的数据类型;
弱类型:不区分变量中存储的数据类型,统一为字符型;
bash:统统默认为字符型数据;变量无需事先声明;

变量为什么有类型?
存储空间、存储格式、参与的运算、……

变量命名:只能使用字母、数字和下划线;而且不能以数字开头;
变量名:见名知义;不能使用程序保留字,
例如if、case、then、fi、esac、for、while、until、break、continue等等;
变量引用:${NAME}, $NAME
变量替换:把变量引用符号出现的位置替换为其指向的内存空间中的数据;

bash变量种类:
本地变量:作用域为当前shell进程;不包括其子进程;
环境变量:使用域为当前shell进程及其子进程;
局部变量
作用域:生效范围,也即可引用到的范围;

位置参数变量
特殊变量

本地变量:
变量赋值:NAME=VALUE
变量引用:$NAME, ${NAME}
""
查看变量:set
撤销变量:unset NAME
注意:此处非为变量引用,因此不能使用$;
所有的本地变量在shell进程终止时,会被自动撤销;

环境变量:
变量声明和赋值:
declare -x NAME[=VALUE]
export NAME[=VALUE]
引用方式:
${NAME}, $NAME

注意:bash内嵌了许多环境变量,名称为全大写字母,例如UID、HOME、PWD、SHELL, PATH, HISTSIZE等等;

环境变量查看:
export, declare -x
env, printenv

撤销环境变量:
unset NAME

只读变量:常量
(1) declare -r NAME
(2) readonly NAME

不支持重新赋值,也不支持撤销操作;
九、I/O重定向和管道
程序:指令+数据
数据:IO

可用于输入的设备,文件
键盘设备、文件系统上的常规文件、网卡设备;
可用于输出的设备:文件
显示器、文件系统上的常规文件、网卡设备;

程序的数据流有三个:
输入数据流:<--,标准输入(stdin),键盘;
输出数据流:-->,标准输出(stdout), 显示器;
错误数据流:-->,错误输出(stderr),显示器;

fd:file descriptor,文件描述符;
stdin: 0
stdout: 1
stderr: 2

IO重定向:

输出重定向:
重定向程序正常执行的结果

COMMAND > /PATH/TO/SOMEFILE
覆盖重定向:覆盖目标文件中的原有内容;
COMMAND >> /PATH/TO/SOMEFILE
追加重定向:追加新产生的内容至目标文件尾部;

shell的一个功能开关:
# set -C
禁止覆盖输出重定向至已存在的文件;
注意:此时仍然可以使用“>|”至目标文件;
# set +C
关闭上述特性;

错误重定向:
重定向错误的执行结果;
COMMAND 2> /PATH/TO/SOMEFILE
错误输出覆盖重定向;
COMMAND 2>> /PATH/TO/SOMEFILE
错误输出追加重定向;

合并标准输出与错误输出流:
(1) &>, &>>
(2) COMMAND > /PATH/TO/SOMEFILE 2>&1
COMMAND >> /PATH/TO/SOMEFILE 2>&1

特殊输出目标:/dev/null
位桶:bit bucket
特殊的输入文件:/dev/zero

输入重定向:
COMMAND < /PATH/FROM/SOMEFILE

tr命令:tr - translate or delete characters //对位转换字符
tr [OPTION]... SET1 [SET2]
把输出的数据当中的字符,实现对位转换,即把数据中的存在于字符集中的字符,统统转换为字符集2中对应的字符;

(1) tr SET1 SET2 < /PATH/FROM/SOMEFILE
字符转换
(2) tr -d SET1 < /PATH/FROM/SOMEFILE
删除

COMMAND << :
Here Document

用法:
COMMAND << EOF
COMMAND > /PATH/TO/SOMEFILE << EOF

管道:
COMMAND1 | COMMAND2 | COMMAND3 | ...

for example:
(1)把/etc/passwd文件最后三行信息中所有小写字符改为大写后输出;
(2):取出/etc/fstab的第6行;
(3):取出/etc目录下所有以p开头的文件或目录,只显示前5个;

tee命令:
tee - read from standard input and write to standard output and files
tee [OPTION]... [FILE]...
-a:使用追加输出,而非覆盖;
COMMAND | tee /PATH/TO/SOMEFILE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bash