如何提升企业数字化转型的效率与灵活性
742
2022-09-21
Lunix基础入门--bash的基础特性(五)
Bash的基础特性:history命令
命令历史:shell进程会其会话中保存此前用户提交执行过的命令;
[root@centos7 ~]# history
定制history的功能,可通过环境变量实现:
HISTSIZE:shell进程可保留的命令历史条数
[root@centos7 ~]# echo $HISTSIZE
1000
HISTFILE:历史命令保存的文件
[root@centos7 ~]# echo $HISTFILE
/root/.bash_history
HISTFILESIZE:历史命令文件的大小
[root@centos7 ~]# echo $HISTFILESIZE
1000
命令用法:
history [-c] [-d 偏移量] [n]
或 history -anrw [文件名]
或 history -ps 参数 [参数...]
选项:
-d:删除指定某条历史命令
[root@centos7 ~]# history -d 347
[root@centos7 ~]# history -d 347 5(加入5的意思是从347条开始向后删除5条)
-c:清空命令历史
[root@centos7 ~]# history -c
-w:从内存历史命令中保存到文件
-r:从文件历史命令读取到内存中
history #:显示最近的#条命令;
调用命令历史列表中的命令:
[root@centos7 ~]# !#:再一次执行历史列表中的第#条命令;
[root@centos7 ~]# !!:再一次执行上一条命令;
[root@centos7 ~]# !STRING:再一次执行历史命令中最近一个以string开头命令;
~]# !tail
调用上一条命令的最后一个参数:
1.ESC+.(点号):会补全最后一个参数
2.!$:会补全最后一个参数
[root@centos7 ~]# ll /etc/sysconfig/network-scripts/ifcfg-eno16777736
[root@centos7 ~]# cat 按键(esc,.)
[root@centos7 ~]# file !$
file /etc/sysconfig/network-scripts/ifcfg-eno16777736
/etc/sysconfig/network-scripts/ifcfg-eno16777736: ASCII text
控制命令历史记录的方式:
环境变量:HISTCONTROL
[root@centos7 ~]# echo $HISTCONTROL
ignoredups:忽略重复的命令;
ignorespace:忽略以空白字符开头的命令;
ignoreboth:以上两者同时生效;
修改变量的值:
NAME='VALUE'
HISTCONTROL=ignorespace
Bash的基础特性:命令/路径补全
命令补全:
shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当作命令;
命令查找机制:
1.查找内部命令;
2.根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名;
[root@centos7 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
给定的打头字符串如果能唯一标识某命令程序文件,则直接补全;
给定的打头字符串如果不能唯一标识某命令程序文件,再击tab键一次,会给出列表;
[root@centos7 ~]# if(键入到此双击“Tab”键,由于不是唯一标识会返回关于if命令列表)
if ifcfg ifconfig ifdown ifenslave ifnames ifstat ifup
路径补全:
在给定的起始路径下,以对应路径下的打头字串来逐一匹配起始路径下的每个文件:
tab键:
如果能惟一标识,则直接补全;
否则,再一次tab,给出列表;
Bash的基础特性之:命令行展开
~:自动展开为用户的家目录,或指定的用户的家目录;
{}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径(并且可以嵌套);
例如:/tmp/{a,b} 相当于 /tmp/a /tmp/b
目录管理类的命令:mkdir, rmdir
mkdir:创建目录命令(make directories)
mkdir [OPTION]... DIRECTORY...
选项:
-p: 自动按需创建父目录(创建z目录,x|y目录不存在,使用-p选项会自动创建x,y目录);
[root@centos7 ~]# mkdir -p /sh/x/y/z
-v: verbose,显示详细过程;
[root@centos7 ~]# mkdir -pv /sh/x/y/z
mkdir: created directory ‘/sh’
mkdir: created directory ‘/sh/x’
mkdir: created directory ‘/sh/x/y’
mkdir: created directory ‘/sh/x/y/z’
-m MODE:直接给定权限;
[root@centos7 ~]# mkdir -m 777 /sh
drwxrwxrwx 2 root root 6 Feb 23 23:04 /sh/
rmdir:删除空目录(remove empty directories)
rmdir [OPTION]... DIRECTORY...
选项:
-p:删除某目录后,如果其父目录为空,则一并删除之(此操作很危险);
[root@centos7 ~]# rmdir -p /sh/a/b/c
rmdir: failed to remove directory ‘/’: Device or resource busy
-v: 显示过程;
tree命令:
tree [options] [directory]
选项:
-L level:执行显示的层级
[root@centos7 ~]# tree -L 2 /etc/
/etc/
├── adjtime
├── aliases
├── aliases.db
├── alternatives
│ ├── ld -> /usr/bin/ld.bfd
基于之上特性和命令,来两道题(解答在文章最后):
问题1:如何创建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b
问题2:如何创建a_c, a_d, b_c, b_d;
问题3:创建如下目录结构:
/tmp/mysysroot/
|-- bin
|-- etc
| `-- sysconfig
| `-- network-scripts
|-- sbin
|-- usr
| |-- bin
| |-- lib
| |-- lib64
| |-- local
| | |-- bin
| | |-- etc
| | |-- lib
| | `-- sbin
| `-- sbin
`-- var
|-- cache
|-- log
`-- run
Bash的基础特性:命令的执行状态结果
命令执行的状态结果:
bash通过状态返回值来输出此结果:
成功:0
失败:1-255
命令执行完成之后,状态返回值保存于bash的特殊变量$?中
[root@centos7 ~]# echo $?
命令正常执行时,有的还回有命令返回值:
根据命令及其功能不同,结果各不相同
Bash的基于特性:引用
强引用:''
弱引用:""
命令引用:``
引用命令的执行结果:
$(Command):
[root@centos7 ~]# mkdir $(date +%F)
``:
[root@centos7 ~]# mkdir `date +%F`
drwxr-xr-x 2 root root 6 Feb 25 07:51 2017-02-25
注:两种执行后的效果一样,一般脚本规范美观实用第一种方式
Bash基础特性:快捷键
Ctrl+a:跳至命令行首
Ctrl+e:跳至命令行尾
Ctrl+u:删除行首至光标所在处之前的所有字符
Ctrl+k:删除光标所在处至行尾的所有字符(包括光标字符)
Ctrl+l:清屏,相当于clear命令
Bash基础特性:globbing
globbing:文件名通配(整体文件名匹配,而非部分)
匹配模式:元字符
*:匹配任意长度的任意字符
pa*, *pa*, *pa, *p*a*
pa, paa, passwd(匹配到的)
?:匹配任意单个字符
pa?, ??pa, p?a, p?a?
[]:匹配指定范围内的任意单个字符
有几种特殊格式:
[a-z], [A-Z], [0-9], [a-z0-9] (单指定a-z不区分大小写)
[[:upper:]]:所有大写字母
[[:lower:]]:所有小写字母
[[:alpha:]]:所有字母
[[:digit:]]:所有数字
[[:alnum:]]:所有的字母和数字
[[:space:]]:所有空白字符
[[:punct:]]:所有标点符号
[^]:匹配指定范围外的任意单个字符
例:
[^[:upper:]]
[^0-9]
[^[:alnum:]]
练习1:显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录;
练习2:显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录;
练习3:显示/etc目录下,以非字母开头,后面跟一个字母及其它任意长度任意字符的文件或目录;
练习4:复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/magedu.com目录
练习5:复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man/ 目录下;
练习6:复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d/目录下;
解答:
1.[root@test7_1 sh]# ls -d /var/l?[[:lower:]]
2.[root@test7_1 sh]# ls -d /etc/[0-9]*[^0-9]
3.[root@test7_1 sh]# ls -d /etc/[^a-z][a-z]*
4.[root@test7_1 sh]# cp -r /etc/m*[^0-9] /tmp/magedu.com/
5.[root@test7_1 sh]# cp -r /usr/share/man/man[0-9] /tmp/man/
6.[root@test7_1 sh]# cp -r /etc/[mnrp]*.conf /tmp/conf.d/
Bash特性之:命令hash
当执行命令时,首先会去hash缓存中查找,查找到会提取使用;未查找到才会查找命令文件,并执行 hash命令只会记录外部命令,内部命令是不会被记录。
缓存此前命令的查找结果:key-value格式
key:搜索键
value:值
hash命令:
hash:列出
hash -d COMMAND(ls):删除
hash -r:清空
Bash的特性之:变量
程序:指令+数据
指令:由程序文件提供;
数据:IO设备、文件、管道、变量
程序也相当于:算法+数据结构
算法:设计解决问题的路径
变量名+指向的内存空间=变量
变量赋值:name=value
变量类型:存储格式、表示数据范围、参与的运算
编程语言:
强类型变量:如C、C++...
弱类型变量:bash属于此类
bash把所有变量统统视作字符型;
变量替换:把变量名出现的位置替换为其所指向的内存空间中数据;
变量引用方式:${var_name}, $var_name
变量名:变量名只能包含数字、字母和下划线,而且不能以数字开头;
变量名:见名知义,命名机制遵循某种法则;不能够使用程序的保留字,例如if, else, then, while等等;
bash变量类型:
本地变量:作用域仅为当前shell进程;
环境变量:作用域为当前shell进程及其子进程;
局部变量:作用域仅为某代码片断(函数上下文);
位置参数变量:当执行脚本的shell进程传递的参数;
特殊变量:shell内置的有特殊功用的变量;
$?:
0:成功
1-255:失败
本地变量:
变量赋值:name=value
变量引用:${name}, $name
"":变量名会替换为其值;
'':变量名不会替换为其值;
查看变量:set
撤销变量:unset name
注意:此处不需要变量引用;
环境变量:
(1) export name=value
(2) name=value
export name
(3) declare -x name=value
(4) name=value
declare -x name
变量引用:${name}, $name
注意:bash内嵌了许多环境变量(通常为全大写字符),用于定义bash的工作环境
PATH, HISTFILE, HISTSIZE, HISTFILESIZE, HISTCONTROL, SHELL, HOME, UID, PWD, OLDPWD
查看环境变量:export, declare -x, printenv, env
撤销环境变量:unset name
只读变量:
(1) declare -r name
(2) readonly name
只读变量无法重新赋值,并且不支持撤销;存活时间为当前shell进程的生命周期,随shell进 程终止而终止;
Bash特性之多命令执行:
分号(;)
[root@test7_1 ~]# COMMAND1; COMMAND2; COMMAND3; ...
执行顺序从左到右执行,没有逻辑关系
逻辑运算:
运算数:真(true, yes, on, 1)
假(false, no, off, 0)
与(乘法):
1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0
或(加法):
1 || 1 = 1
1 || 0 = 1
0 || 1 = 1
0 || 0 = 0
非(取反):
! 1 = 0
! 0 = 1
异或:
不相同则为1,相同则为0
短路法则:
[root@test7_1 ~]# COMMAND1 && COMMAND2
COMMAND1为“假”,则COMMAND2不会再执行;
否则,COMMAND1为“真”,则COMMAND2必须执行;
[root@test7_1 ~]# COMMAND1 || COMMAND2
COMMAND1为“真”,则COMMAND2不会再执行;
否则,COMMAND1为“假”,则COMMAND2必须执行;
示例:
[root@test7_1 ~]# ll /sh/mydata.txt || touch /sh/mydata.txt
ls: cannot access /sh/mydata.txt: No such file or directory
-rw-r--r-- 1 root root 0 Apr 16 21:03 mydata.txt
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~