bash相关特性

一、bash的快捷键:
C:Ctrl键;M:Alt键;E:ESC键
C-l:清屏,相当于clear命令;
C-a:将光标跳转至命令行编辑模式的行首;
C-e:将光标跳转至命令行编辑模式的行尾;
C-k:删除命令行编辑模式的光标所在位置至行尾的内容
C-u:删除命令行编辑模式的光标所在位置至行首的内容
C-c:结束前台进程;
M-.:引用上一个命令中的最后一个参数;(在Xshell中不能用)
E,.:功能同M-.先按ESC再按".",前几个都是同时按下;

二、命令历史:
Bash进程会保存其会话中的用户曾经执行过的命令,以方便用户重复执行某个命令操作;
命令历史包括两个方面:
1.用户曾经执行过的命令;
2.用户曾经执行过的命令的路径;

在Bash中有一个内置的变量“PATH”,PATH变量的值为当前系统中所有的命令的文件所在的路径的集合;

命令如何被shell执行的?
bash会将命令行的内容按照空白字符进行切片,分析第一个切片内容
1.判断第一个切片的内容是内部命令还是外部命令;
如果是内部命令,直接运行;
如果是外部命令,先找hash表中的路径缓存,如果有,则直接执行;否则通过查找PATH变量中包含路径中,是否有对应名称文件

使用hash命令可查看被记住的命令文件的路径;
eg: ~]# hash


使用history命令查看被记住的命令的命令行参数;
history - 显示或操纵历史列表。
格式: history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 参数 [参数...]

常用选项:
-c:清空历史缓冲区中的命令历史记录;
-d OFFSET:删除指定的历史命令条目;

重复执行历史缓冲区中的命令:
!NUMBER:重复执行历史缓冲区中编号为"NUMBER"的命令;
!STRING:重复执行历史缓冲区中以"STRING"开头的最后一次执行过的命令;
!?STRING:重复执行历史缓冲区中包含了"STRING"的最后一次执行过的命令;
!-NUMBER:重复执行历史缓冲区中倒数第"NUMBER"条命令;
使用上、下Arrow可以从历史缓冲区中调用命令;
C-r:在历史缓冲区中实施搜索,回车之后执行

!$:在历史缓冲区中调用最后一个命令的最后一个参数;
!^:在历史缓冲区中调用最后一个命令的第一个位置的参数;
!:NUMBER:在历史缓冲区中调用最后一个命令的第"NUMBER"位置参数
!SEQUENCE:NUMBER:历史缓冲区中调用第"SEQUENCE"条命令的第"NUMBER"位置参数

在bash中与命令历史相关的内置变量:
HISTSIZE:历史缓冲区中能够保存的命令历史的最大条目数量认值为1000;
HISTFILESIZE:~/.bash_history文件中能够保存的命令历史的最大条目数量认值为1000;
HISTTIMEFORMAT:在命令历史缓冲区中记录历史命令时,同时记录命令的执行的时间戳标记;可以使用date命令的FORMAT来表示时间的记录格式;认值为空;
HISTCONTROL:控制命令历史的记录方式:
ignoredups:连续且相同的命令不会被记录到历史缓冲区;此为认值;
ignorespace:以空白字符开头的命令不会被记录到历史缓冲区;
ignoreboth:上述两种情况都不会被记录到历史缓冲区;

三、命令补全——(TAB键的使用)
包括两个方面的内容
1.构成命令字符串的补全;
参考PATH变量中的路径,对命令进行补全:
如果,给出的字符串在PATH变量对应的路径中是唯一的,则直接补全命令;
如果,给出的字符串在PATH变量对应的路径中不唯一,则bash给出提示

2.命令中参数所对应的字符串补全;
根据给出的路径进行补全:
如果,给出的字符串在给出的路径中是唯一的,则直接补全参数;
如果,给出的字符串在给出的路径中不唯一,则bash给出提示

四、命令行展开
(a+b+c)(d+e+f)=ad+ae+af+bd+be+bf+cd+ce+cf
1.~展开:
~:bash会自动将其展开为当前登录用户的家目录;
~STRING:bash会自动将其展开为以"STRING"为用户名用户的家目录;

~+:调用bash的内置变量"PWD"的值;
~-:调用bash的内置变量"OLDPWD"的值;

2.{}展开:
在"{}"中,可以填充一个以","分隔的路径列表,bash会将其展开为多个独立的路径;
示例:
~]# mkdir -pv /china/{hb,hn,jl,hlj,ln}/{link,linka,linkb}/class18

~]# cp 1.txt{,.bak}
1.txt{,.bak} == 1.txt 1.txt.bak

五、命令的执行结果
在bash中,命令的执行结果有两种:
1.执行命令的输出结果:
根据用户的需求获取到的命令执行的正常输出结果;
2.执行命令的状态返回值:
此前的一个命令是否成功执行相关的返回内容
bash使用一个特殊的内置变量来保存其内容:$?
$?实际上保存的是一个数值,其取值范围:0-255
其中:
0:表示命令执行成功;
1-255:表示命令执行失败;
1,2,127:bash中内置的命令执行失败的状态返回值;
1:表示小问题;
2:表示严重问题;
127:表示命令本身出现问题;
其余数字(3-126,128-255):用户可以自定义的失败状态返回值;

六、引用功能
'':强引用
凡是被单引号引用的内容,bash在处理时,一律视其为普通字符,即使其本身是bash定义的具有特殊功能和作用字符亦是如此,但单引号本身除外;

"":弱引用
被双引号引用的内容中,有些特殊字符仍然会保留其特殊含义,如: $,\,"";
eg:[root@localhost ~]# echo '$(date)'
$(date)
[root@localhost ~]# echo "$(date)"
2018年 04月 03日 星期二 15:41:53 CST

七、转义功能
\:bash定义的转义字符;大多数的情况下,"\"只能将其后面一个字符转义;

\COMMAND:取消定义过的命令别名,而使用命令本身的功能

八、Globbing——文件通配符,简称为glob;
*:匹配任意长度的任意字符或字符串;(某些特殊位置的"."字符不能匹配;)
?:匹配任意单个字符;(某些特殊位置的"."字符不能匹配;)
[]:匹配指定范围内的任意单个字符,必须匹配且只能匹配一个字符;
指定范围的方法
1.枚举法:列出所有有效字符;
2.范围指定:
[0-9]:表示所有单个的十进制数字;
[a-z]:所有小写字母
[A-Z]:所有大写字母
3.bash内建字符集:
[:lower:]:所有的小写字母
[:upper:]:所有的大写字母
[:alpha:]:所有字母,包括大小写;
[:digit:]:所有单个的十进制数字;
[:alnum:]:所有的字母和十进制数字;
[:punct:]:所有的符号;
[:space:]:表示空白字符,包括空格和制表符;
4.反向匹配:
[^]
示例:
#ls a[^[:digit:]]?? //表示文件名的第二个字符不能是十进制数字;

注意:当中括号中有"^"表示字符集反向匹配时,注意"*"的使用;因为"*"通配范围可能会导致反向匹配失败;此类失败是因为bash的globbing是在贪婪模式下匹配的;

九、管道
|
管道通常是用来连接多个命令的;将管道符号前面的命令的执行的输出结果通过管道传递给管道符号后面的命令,让后面的命令将前面命令的输出结果当成参数使用;
注意:
1.一般来讲,凡是被管道连接的命令,都应该能够在执行成功之后完成命令结果的输出,否则管道无意义;
2.管道不是万能的,有些场合没办法使用管道的;

十、命令引用或命令替换:

`` 相当于 $(),用于引用命令的结果
``:反向单引号,反引号;(与"~"同一个键)
示例:
创建一个文件文件名为test-系统时间;
~]# touch test-`date +%F-%H-%M-%s`

~]# touch test-$(date +%F-%H-%M-%s)


十一、输入输出重定向

可以用于输入的设备:文件
键盘设备、文件系统中的常规文件、网卡设备、声卡设备、磁盘设备等;

可以用于输出的设备:文件
显示器、文件系统中的常规文件、网卡设备、声卡设备、磁盘设备等;

在内存中使用文件的方式是定义文件描述符,一个文件描述符对应一个文件
0:表示标准输入,stdin,从键盘实现的输入数据流;
1:表示标准输出,stdout,到显示器的输出数据流;
2:表示标准错误,stderr,到显示器的错误数据流;

输入输出重定向(IO重定向)
采用非标准设备文件实现的IO操作;
输入重定向
<

输出重定向
>:覆盖输出重定向
~]# set -C //开启防止意外覆盖源文件开关,可以使用">|"符号完成覆盖重定向输出的操作,而无需关心是否开启此开关;
~]# set +C //关闭防止意外覆盖源文件开关
>>:追加输出重定向

错误重定向
2>:覆盖错误重定向
2>>:追加错误重定向;可用于收集程序执行返回的错误信息;执行正确则不追加任何信息;

合并标准输出和标准错误重定向
1.COMMAND {>|>>} /PATH/TO/SOMEFILE 2>&1
2.&>,&>> 不管命令执行结果是否正确,都会将标准输出重定向到指定文件

特殊的设备文件
/dev/null:BlackHole,BitBucket(位桶)
/dev/zero:泡泡机,吐零机;

bash中的其他特殊符号:
< :输入重定向
eg:[root@localhost ~]# cat < /etc/fstab
#
# /etc/fstab
.......................
用处很少,因为在命令行中参数与命令之间认存在此字符;

<<:here document,此处文档,结束标记
示例:
[root@localhost ~]# cat << boom
> i love you
> boom
i love you
以输入的字符串(boom)为开始,以他(boom)结束之间的所有数据当作参数传给前面的命令;

<<<:here string,此处字符串,结束标记
示例:
[root@localhost ~]# bc <<< 20/5
4

十二、bash变量
变量:一段有名称的连续的内存空间;这段内存空间的名称,称为变量名;在这段内存空间中存储的数据,则称为变量值;

向变量(内存空间)中存储数据的过程,称为赋值操作;赋值符号通常为"=";

变量的类型:
123 -- 整型:01111011
-- 字符型:ASCII:3字节
-- 字符型:UTF-8:9字节

变量分为:
强变量:使用之前必须事先予以声明;必须声明变量类型;(C语言中的变量)
弱变量:在使用之前无需声明,无需指明变量类型;(bash变量)

变量的赋值方法
VARNAME=VALUE
其含义:将某数值(VALUE)通过赋值操作(=)存储于特定的内存空间中(VARNAME);

bash中变量名称的命名规范:
1.变量名只能以"_"或"字母"为起始字符,后面的其他字符可以是任意字母,数字或下划线;
2.变量名中的字母是大小写敏感的;
3.命名的书写格式:
全大写:HISTSIZE
全小写:myvar
驼峰式:MyNewVariable
连接式:My_New_Var
4.变量名要能做到见名知意;
5.变量名不能与已知变量或bash的内置变量重复;

bash中的变量的分类
根据变量的作用范围来划分:
全局变量(环境变量):作用范围为整个shell进程,包括其子shell;
本地变量:作用范围为当前登录时打开的shell进程,不包括其子shell;
局部变量:作用范围仅仅只是当前程序段,一般用于函数

根据变量的声明方式来划分:
bash内置变量:
普通的内置变量:HISTSIZE,...
位置参数变量:$0,$1,$2,...
特殊变量:$?,$#,$*,$@,$$,...
$?:展开为最近一次执行的命令的状态返回值(退出状态码);用以表示最近一次执行的命令是否成功执行;
$#:不包括$0在内的其余的位置参数的个数,以十进制数字表示;
$*:从$1开始展开为位置参数。当使用双引号引用展开的结果时,它展开为特殊变量IFS的第一个字符分隔的值;
$@:从$1开始展开为位置参数。当使用双引号引用展开的结果时,它展开为一个单独的字符串;
$$:展开为当前shell的进程标识符;
自定义变量:

变量的使用:
1.变量的声明和赋值:
1) 声明全局变量(环境变量):
export VARNAME
export VARNAME=VALUE

declare命令:
declare - Set variable values and attributes - 设置变量值和属性
格式:declare [-aAfFgilrtux] [-p] [name[=value] ...]
常用的选项:
-a:声明索引数组(如果支持)
-A:声明关联数组(如果支持)
-i:声明整型变量
-l:声明变量并将变量值中的字母转换为小写字母;
-u:声明变量并将变量值中的字母转换为大写字母;
-r:声明只读变量;该变量仅能进行一次赋值操作;
-x:声明变量并将其导出为全局变量

declare -x VARNAME[=VALUE]

2) 声明本地变量:
VARNAME=VALUE

3) 声明局部变量:
local VARNAME[=VALUE]
local命令 - 定义本地变量
本地变量只能在函数内部被使用,它们只能在定义它们的函数内部以及子函数中可见。

2.查看环境变量:
set命令:
显示当前shell的变量,包括当前用户的变量
export命令:
查看变量名称,也可以为变量赋值;
env命令:
显示当前用户的变量
3.查看变量的值:
echo ${VARNAME}

4.撤销变量的赋值及变量声明
unset VARNAME

有关于保存变量的shell配置文件
通用配置文件
/etc/bashrc
/etc/profile
/etc/profile.d/*
私人配置文件
~/.bashrc
~/.bash_profile
注意:
1.一般情况下,变量都是随用随声明,除非有必要,否则不建议修改配置文件内容

2.声明的变量在使用完以后,最好使用unset命令予以撤销;避免影响计算机性能



十三、逻辑运算

逻辑运算:与、 或、非。

与:&&,双目运算符,COMMAND1 && COMMAND2,当命令一执行成功后执行命令二;

或:||, 双目运算符,COMMAND1 || COMMAND2, 当命令一执行失败后执行命令二;

非:!,单目运算符,取反操作;

!COMMAND1 && COMMAND2 相当于 COMMAND1 || COMMAND2
!COMMAND1 || COMMAND2 相当于 COMMAND1 && COMMAND2

!(A && B) = !A || !B
! (A || B) = !A && !B

(双目运算符表示需要两个参数,单目运算符表示需要一个参数)

示例:

如果用户user存在并且其家目录也存在,那么执行userdel -r id user && ls -d /home/user && userdel -r user

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...