Lunix基础入门--bash的基础特性(五)

网友投稿 742 2022-09-21

Lunix基础入门--bash的基础特性(五)

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小时内删除侵权内容。

上一篇:学习编程的路该怎么走?
下一篇:Shell脚本日志关键字监控+告警(shell实时监控日志)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~