CentOS系统Shell编程语言基础之Bash的基础特性

bash的基础特性之命令历史:

命令历史:shell进程会在其会话中保存此前用户提交执行过的命令
~]#history
定制history的功能,可通过环境变量实现
HISTSIZE:shell进程可保留的命令历史的条数
HISTFILE:持久保存命令历史的文件, “.bash_history”
HISTFILESIZE:命令历史文件的大小

命令用法:

history [-c] [-d offset] [n]
or history -anrw [filename]
or history -ps arg [arg…]

命令常用选项:

-c:清空命令历史
-d offset:删除指定命令历史
-r:从文件读取命令历史至历史列表中
-w:把历史列表中的命令追加至历史文件中

history +数字:显示最近的“数字”条命令

 

调用命令历史列表中的命令:

!+数字:再一次执行历史列表中的第“数字”条命令
!!:再一次执行上一条命令
!STRING:再一次执行命令历史列表中最近一个以STRING开头的命令

注意:命令的重复执行有时候需要依赖于幂等性

 

调用上一条命令的最后一个参数:
快捷键:ESC ,.
字符串:!$

 

控制命令历史记录的方式:
环境变量:HISTCONTROL
ignoredups:忽略重复的命令
ignorespace:忽略以空白字符开头的命令
ignoreboth:以上两者同时生效

修改变量的值: NAME=’VALUE’,此修改只对当前shell有效

 

bash的基础特性之命令补全:

命令补全:shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符会被当作命令

命令查找机制:
查找内部命令
根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名

给定的打头字符串如果能唯一标识某命令程序文件,则直接补全;
给定的打头字符串如果不能唯一标识某命令程序文件,再击tab键一次,会给出列表

路径补全:
在给定的起始路径下,以对应路径下的打头字符串来逐一匹配起始路径下的每个文件

tab:如果能唯一标识某命令程序文件,则直接补全;如果不能唯一标识某命令程序文件,再击tab键一次,会给出列表

 

bash的基础特性之命令行展开:

~:自动展开为用户的家目录,或指定用户的家目录
{}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径
例如:/tmp/{a,b}相当于/tmp/a /tmp/b

 

bash的基础特性之命令的执行状态结果

命令执行的状态结果:
bash通过状态返回值来输出此结果
成功:0
失败:1-255
命令执行完成之后,其状态返回值保存于bash的特殊变量”$?”中, ~]#echo $?

命令正常执行时,有的还会有命令返回值,根据命令及其功能不同,结果各不相同

引用命令的执行结果:
$(COMMAND) 或COMMAND

 

bash的基础特性之引用:

强引用:‘’
弱引用:“”
命令引用:(~位置)

 

bash的基础特性之快捷键:

Ctrl+a:跳转至命令行行首
Ctrl+e:跳转至命令行行尾
Ctrl+u:删除行首至光标所在处之间的所有字符
Ctrl+k:删除光标所在处至行尾的所有字符
Ctrl+l:清屏,相当于clear命令

bash的基础特性之globbing(文件名通配机制):

 

globbing:文件名通配机制(整体文件名匹配,而非部分)

匹配模式:元字符
*:匹配任意长度的任意字符
pa*:以pa开头的所有文件
*pa*:文件名包含pa的文件
*pa:以pa结尾的文件

?:匹配任意单个字符
pa?:匹配以pa开始的下一个为p或a中任意一个的文件

[]:匹配指定范围内的任意单个字符
有几种特殊格式:
[a-z],[A-Z],[0-9],[a-z,0-9]
[[;upper;]]:所以大写字母
[[;lower;]]:所有小写字母
[[;alpha;]]:所有字符
[[;digit;]]:所有数字
[[;alnum;]]:所有的字母和数字
[[;sapce;]]:所有的空白字符
[[;punct;]]:所有标点符号

 

[^]:匹配指定范围外的任意单个字符
[^[;upper;]]:所有非大写字母

pa[0-9][0-9],  2[0-9][0-9](表示200-299的数字)

练习1:显示/var目录下所有以l,以小写字母结尾,且中间出现一位任意字符的文件或目录
ls -d /var/l?[[;lower;]]
练习2:显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录
ls -d /etc/[0-9]*[^0-9]
练习3:显示/etc目录下,以非字母开头,后面跟一个字母及其任意长度任意字符的文件或目录
ls -d /etc/[^a-z][a-z]*
练习4:复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/magedu.com目录
cp -r /etc/m*[^0-9] /tmp/magedu.com
练习5:复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man目录下
cp -r /usr/share/man/man[0-9] /tmp/man
练习6:复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d目录下
cp -r /etc/[mnrp]*.conf /tmp/conf.d

 

bash特性之命令hash:

缓存此前命令的查找结果:key-value
key:搜索键,value:值
hash命令
   hash:列出
   hash -d command :删除
   hash- r :清空

bash的特性之变量:

程序:指令+数据
指令:由程序文件提供
数据:IO设备、文件、管道、变量
程序:算法+数据结构
变量名+指向的内存空间
变量赋值:name=value
变量类型:存储格式、表示数据范围、参与的运算
    编程语言:
            强类型变量
            弱类型变量:
                   bash把所有变量统统视作字符型
                   bash中的变量无需事先声明,相当于把声明和赋值过程同时实现
                          声明:声明其类型,定义出其变量名称
            变量替换:把变量名出现的位置替换为其所指向的内存空间中数据
            变量引用:${var_name},$var_name
            变量名:变量名只能包含数字、字母和下划线,而且不能以数字开头
            变量名:见名知义,命名机制遵循某种法则;不能够使用程序的保留字,例如if,else,then,while等
        bash变量类型:
             本地变量:作用域仅为当前shell进程
             环境变量:作用域为当前shell进程及其子进程
             局部变量:作用域仅为某代码片段(函数上下文)
             位置参数变量:向执行脚本的shell进程传递的参数
             特殊变量:shell内置的有特殊功用的变量
                      $?:用于执行上一个命令的执行状态结果
                本地变量:
                    变量赋值:name=value
                    变量引用:${var_name},$var_name
                         “”:变量名会替换为其值
                         ‘’:变量名不会替换为其值
                    查看变量:set
                    撤销变量:unset name
                            注意:此处非变量引用
              环境变量:
                  变量赋值:
                      (1)export name=value
                      (2)name=value
                           exportname
                     (3)declare -x name=value
                     (4)name=value
                          declare -x name
                     变量引用:${name},$name
              注意:bash内嵌了许多环境变量(通常为全大写字符),用于定于bash的工作环境 (PATH,HISTFILE,HISTSIZE,HISTFILESIZE,UID)
                 查看环境变量:export,declare -x,printenv,env
                 撤销变量:unset name
          只读变量:
           (1)declare -r name
           (2)readonly name
                注意:只读变量无法重新赋值,并且不支持撤销,存货时间为当前shell进程的生命周期,随shell进程终止而终止

bash特性之多命令执行:

~]#COMMAND1;COMMAND2;COMMAND3;…
逻辑运算:
      运算数:真(true,yes,on,1)
                      假(false,no,off,0)
           与:
               1 && 1 = 1
               1 && 0 = 0
               0 && 1 = 0
               0 && 0 = 0
         或:
              1 || 0 =1
              1 || 1 =1
              0 || 1 =1
              0 || 0 =0
         非:
              ! 1 = 0
              ! 0 = 1
   短路法则:
         ~]#COMMAND1 && COMMAND2
                COMMAND1为“假”,则COMMAND2不会再执行
                否则,COMMAND1为“真”,则COMMAND2必须执行
            例:[root@localhost ~]# touch /tmp/test.etc && ls /etc > /tmp/test.etc
                 [root@localhost ~]# cat /tmp/test.etc
         ~]#COMMAND1 || COMMAND2
                COMMAND1为“真”,则COMMAND2不会再执行
                否则,COMMAND1为“假”,则COMMAND2必须执行
             例:[root@localhost ~]# id user1 || useradd user1
                 id: user1:无此用户
                 [root@localhost ~]# id user1
                  uid=2003(user1) gid=2003(user1) 组=2003(user1)

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/101835

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code