bash的基础特性[更新中]

2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。
3、请使用命令行展开功能来完成以下练习:
(1)、创建/tmp目录下的:a_c, a_d, b_c, b_d
(2)、创建/tmp/mylinux目录下的:
mylinux/
├── bin
├── boot
│   └── grub
├── dev
├── etc
│   ├── rc.d
│   │   └── init.d
│   └── sysconfig
│   └── network-scripts
├── lib
│   └── modules
├── lib64
├── proc
├── sbin
├── sys
├── tmp
├── usr
│   └── local
│   ├── bin
│   └── sbin
└── var
├── lock
├── log
└── run
5、如何定义一个命令的别名,如何在命令中引用另一个命令的执行结果?
6、显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
7、显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
8、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
9、在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。
10、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
11、复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
12、复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。

      • bash的基础特性[更新中]
        • 1. 命令状态返回值
        • 2. 命令行展开
        • 3. alias别名
        • 4. glob通配符

1. 命令状态返回值

在bash或其他shell中,命令的执行有两种结果:执行结果状态结果

  • 状态结果
    bash通过状态返回值来输出此结果。

    • 成功:状态结果为0
    • 失败:状态结果为1-255

命令执行完成之后,其状态返回值保存于bash的特殊变量$?中,通过echo $?查看状态结果。

  • 状态结果查看示例
    [root@localhost ~]# ls /home
    test1 test2
    [root@localhost ~]# echo $?
    0
    [root@localhost ~]# lsd /home
    -bash: lsd: command not found
    [root@localhost ~]# echo $?
    127
  • 执行结果
    命令正常执行时,有的还会有命令返回值(命令执行结果),根据命令及其功能不同,结果各不相同。

可以直接引用命令的执行结果作为下一命令的输入:

  • $(COMMAND)
  • `COMMAND` – -> 这里是反引号,不是单引号。
  • 引用命令执行结果示例:
  1. 在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22
    • 引用date命令的执行结果,touch /tmp/tfile-$(date +%F-%H-%M-%S)
      [root@localhost tmp]# touch /tmp/tfile-$(date +%F-%H-%M-%S)
      [root@localhost tmp]# ll tfile*
      -rw-r--r--. 1 root root 0 Mar 16 22:37 tfile-2018-03-16-22-37-38
      [root@localhost tmp]# touch /tmp/tfile-$(date +%F-%H-%M-%S)
      [root@localhost tmp]# ll tfile*
      -rw-r--r--. 1 root root 0 Mar 16 22:37 tfile-2018-03-16-22-37-38
      -rw-r--r--. 1 root root 0 Mar 16 22:37 tfile-2018-03-16-22-37-45

2. 命令行展开

  • ~:自动展开为用户的家目录,或指定的用户的家目录
  • {}:可承载一个以逗号分隔的路径列表,或以..连接的一个序号范围内的路径列表,并能够将其展开为多个路径;
    例如:/tmp/{a,b}相当于/tmp/a /tmp/b,/tmp/a{1..9}相当于/tmp/a1,/tmp/a2…到/tmp/a9。
  • 命令行展开的用法示例
    1. 创建/tmp目录下的:a_c, a_d, b_c, b_d
      • touch /tmp/{a,b}_{c,d}
        [root@localhost tmp]# touch /tmp/{a,b}_{c,d}
        [root@localhost tmp]# ls
        a_c a_d b_c b_d
    2. 创建/tmp/mylinux目录下的如下树结构
      ├── bin
      ├── boot
      │ └── grub
      ├── dev
      ├── etc
      │ ├── rc.d
      │ │ └── init.d
      │ └── sysconfig
      │ └── network-scripts
      ├── lib
      │ └── modules
      ├── lib64
      ├── proc
      ├── sbin
      ├── sys
      ├── tmp
      ├── usr
      │ └── local
      │ ├── bin
      │ └── sbin
      └── var
      ├── lock
      ├── log
      └── run

      • mkdir -pv /tmp/mylinux/bin/{boot/grub,dev,etc/{rc.d/init.d,sysconfig/network.scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local/{bin,sbin},var/{lock,log,run}}
        [root@localhost tmp]# tree /tmp/mylinux
        /tmp/mylinux
        └── bin
        ├── boot
        │ └── grub
        ├── dev
        ├── etc
        │ ├── rc.d
        │ │ └── init.d
        │ └── sysconfig
        │ └── network.scripts
        ├── lib
        │ └── modules
        ├── lib64
        ├── proc
        ├── sbin
        ├── sys
        ├── tmp
        ├── usr
        │ └── local
        │ ├── bin
        │ └── sbin
        └── var
        ├── lock
        ├── log
        └── run
        24 directories, 0 files
    3. 在/tmp/test/目录下创建9个文件,文件名为file1到file9
      • touch /tmp/test/file{1..9}
        [root@localhost tmp]# touch /tmp/test/file{1..9}
        [root@localhost tmp]# ls test
        file1 file2 file3 file4 file5 file6 file7 file8 file9

3. alias别名

alias是命令的别称,用户可以定义alias来快速使用某命令行,其作用就是可以简写命令

  • 查看别名
    可以使用命令alias获取所有可用别名的定义。

    • alias
      [root@localhost tmp]# alias
      alias cp='cp -i'
      alias egrep='egrep --color=auto'
      alias fgrep='fgrep --color=auto'
      alias grep='grep --color=auto'
      alias l.='ls -d .* --color=auto'
      alias ll='ls -l --color=auto'
      alias ls='ls --color=auto'
      alias mv='mv -i'
      alias rm='rm -i'
      alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
  • 定义或修改别名
    • alias NAME=’COMMAND’ ,只对当前shell进程有效。
    • 如创建一个名为mkdirs的alias,alias mkdirs=’mkdir -pv dir1/dir2/dir3{a..d}’
      [root@localhost tmp]# alias mkdirs='mkdir -pv dir1/dir2/dir3{a..d}'
      [root@localhost tmp]# mkdirs
      mkdir: created directory ‘dir1’
      mkdir: created directory ‘dir1/dir2’
      mkdir: created directory ‘dir1/dir2/dir3a’
      mkdir: created directory ‘dir1/dir2/dir3b’
      mkdir: created directory ‘dir1/dir2/dir3c’
      mkdir: created directory ‘dir1/dir2/dir3d’
      [root@localhost tmp]# tree dir1
      dir1
      └── dir2
      ├── dir3a
      ├── dir3b
      ├── dir3c
      └── dir3d
    • 修改~/.bashrc文件(用户家目录下),对当前用户永久有效,
      在文件末尾添加定义的别名alias NAME='COMMAND'
      修改后下次登录生效,或执行source ~/.bashrc立即生效。
      这里不再做演示。

4. glob通配符

Linux使用过程中,查找所需的文件是非常普遍的操作。Shell提供了一套字符串匹配规则,使用元字符匹配检索内容,伊阿斑用于检索文件名。当Shell遇到元字符时,会把它们当作特殊字符进行特殊处理,而非普通字符的处理方式,这些元字符是globbing(通配符)

通配符是对整体文件名进行匹配,而非部分,并且不区分大小写

  • 通配符匹配模式

*:匹配任意长度的任意字符
?:匹配任意单个字符
[]:匹配指定范围内的任意单个字符

如:[a-z],[A-Z],[0-9],[a-z0-9]

[!]:匹配指定范围外的任意单个字符

[!]和正则表达式中的[^]作用相同

  • 正则表达式
    正则表达式是一个字符匹配标准,不同于通配符的常用于文件名匹配和Shell解析,正则表达式更多用来匹配文件内容,并需要工具的支持,如sed、grep、awk等。
  • 正则表达式的匹配模式
    • 字符匹配
      .:匹配任意单个字符
      *:匹配其前面一个字符出现任意次
      ?:匹配其前面的字符1次或0次
      +:匹配其前面一个字符出现至少一次(在扩展正则表达式中)
    • 位置匹配
      ^:锚定行首
      $:锚定行尾
      \<或\b:锚定词首,其后面的任意字符必须作为单词首部出现
      \>或\b:锚定词尾,其前面的任意字符必须作为单词尾部出现
      \B:非单词的开头或结尾
      ^$:空白行
    • 分组
      (ab)* : 匹配ab这个分组出现任意次
      \1:引用第一个左括号以及与之对应的右括号所包括的所有内容,同理还有\2,\3
    • 特殊子字符类
      [:alnum:] :任何字母和数字
      [:alpha:] :任何字母
      [:cntrl:] :控制字符. 在ASCII表中对应八进制000 到 037, 和177 (‘DEL’).
      [:digit:] :任何数字
      [:graph:] :匹配打印字符,相当于’[:alnum:]’ +’[:punct:]’.
      [:lower:] :小写字母
      [:print:] :可打印字符,相当于 ‘[:alnum:]’, ‘[:punct:]’, 和space.
      [:punct:] 标点符号,’! ” # $ % & ’ ( ) * + , – . / : ; < = > ? @ [ \ ] ^ _ ’ { | } ~’
      [:space:] 空白字符,tab, newline, vertical tab, form feed, carriage return, and space.
      [:upper:] 大写字母
      [:xdigit:] 任何16进制的数字,相当于[0-9a-fA-F]
  • 通配符配合正则表达式的特殊子字符来使用
    • 通配符[]
      [[:upper:]]:所有大写字母
      [[:lower:]]:所有小写字母
      [[:alpha:]]:所有字母
      [[:digit:]]:所有数字
      [[:alnum:]]:所有字母和数字
      [[:space:]]:所有空白字符
      [[:punct:]]:所有标点符号
    • 通配符[^]
      如:[^[:upper:]]:除大写字母外的单个字符,
      其他子字符用法相同,不作一一列举。
  • 通配符使用示例
    1. 显示/tmp目录下,以任意一位数字开头,且以非数字结尾的文件或目录
      • ls -d /tmp/[0-9]*[^0-9]
        [root@localhost tmp]# ls -d /tmp/*
        /tmp/1_a /tmp/1dir /tmp/3_b /tmp/5_b /tmp/h_7 /tmp/i_7 /tmp/j_7
        /tmp/1_b /tmp/2dir /tmp/3_c /tmp/5_c /tmp/h_8 /tmp/i_8 /tmp/j_8
        /tmp/1_c /tmp/3_a /tmp/5_a /tmp/h_6 /tmp/i_6 /tmp/j_6
        [root@localhost tmp]# ls -d /tmp/[0-9]*[^0-9]
        /tmp/1_a /tmp/1_c /tmp/2dir /tmp/3_b /tmp/5_a /tmp/5_c
        /tmp/1_b /tmp/1dir /tmp/3_a /tmp/3_c /tmp/5_b
    2. 显示/tmp/目录下,以非字母开头后面跟一个字母及其他任意长度任意字符的文件或目录
      • ls -d /tmp/[^a-z][a-z]*
        [root@localhost tmp]# ls -d /tmp/[^a-z][a-z]*
        /tmp/1dir /tmp/2dir
    3. 复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
      • cp -r /etc/p*[^0-9] /tmp/mytest1
        [root@localhost mytest1]# cp -r /etc/p*[^0-9] /tmp/mytest1
        [root@localhost mytest1]# ls
        pam.d pcp.conf pear.conf pki postfix profile python
        passwd pcp.env php.d plymouth ppp profile.d
        passwd- pcp.sh php.ini pm prelink.conf.d protocols
        pcp pear pinforc popt.d printcap pulse
    4. 显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
      • ls -d /var/l?*[[:lower:]]
        [root@localhost ~]# ls -d /var/l?*[[:lower:]]
        /var/lib /var/local /var/lock /var/log
    5. 显示/tmp目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
      • ls -d /tmp/[0-9]*[^0-9]
        [root@localhost ~]# ls -d /tmp/[0-9]*[^0-9]
        /tmp/1_a /tmp/1_c /tmp/2dir /tmp/3_b /tmp/5_a /tmp/5_c
        /tmp/1_b /tmp/1dir /tmp/3_a /tmp/3_c /tmp/5_b
    6. 显示/tmp目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
      • ls -d /tmp/[^a-z][a-z]*
        [root@localhost ~]# ls -d /tmp/[^a-z][a-z]*
        /tmp/1dir /tmp/2dir
    7. 复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
      • cp -r /etc/*.d /tmp/mytest2
        [root@localhost mytest2]# cp -r /etc/*.d /tmp/mytest2
        [root@localhost mytest2]# ls
        auto.master.d init.d profile.d rwtab.d
        bash_completion.d latrace.d rc0.d setuptool.d
        binfmt.d ld.so.conf.d rc1.d slp.reg.d
        cgconfig.d logrotate.d rc2.d statetab.d
        chkconfig.d modprobe.d rc3.d sudoers.d
        cron.d modules-load.d rc4.d sysctl.d
        depmod.d my.cnf.d rc5.d tmpfiles.d
        dnsmasq.d oddjobd.conf.d rc6.d usb_modeswitch.d
        dracut.conf.d pam.d rc.d xinetd.d
        exports.d php.d reader.conf.d yum.repos.d
        gdbinit.d popt.d request-key.d
        grub.d prelink.conf.d rsyslog.d
    8. 复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。
      • cp /etc/[l,m,n]*.conf /tmp/mytest3
        [root@localhost mytest3]# cp /etc/[l,m,n]*.conf /tmp/mytest3
        [root@localhost mytest3]# ls
        ld.so.conf locale.conf mke2fs.conf ntp.conf
        libaudit.conf logrotate.conf nfsmount.conf numad.conf
        libuser.conf man_db.conf nsswitch.conf

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

(0)
GeniusyqcGeniusyqc
上一篇 2018-03-17 21:06
下一篇 2018-03-18 10:04

相关推荐

  • N28 第三周【1】:grep和文本处理工具的使用

    grep一些练习 1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost ~]# who |cut -d” ” -f1 |sort -u root 2、取出最后登录到当前系统的用户的相关信息。 [root@localhost ~]# last |cut -d” ” -f1|head -1 |…

    Linux干货 2017-12-19
  • 脚本编写规范

    脚本编写规范 脚本名称以.sh结尾,名称见名知意 尽量使用UTF-8编码,注释及输出尽量使用英文 一般给到执行权限,但一些关于变量的配置文件不用加执行权限 执行的时候可以使用bash执行,或者使用bash -x 调试执行 脚本首行以#!/bin/bash,无空格,不带选项 第二行为空格或者添加一行空注释 开始注释内容:  #!/bin/bash&n…

    Linux干货 2017-04-16
  • 浅析linux软、硬链接

    软链接 硬链接 不同点 创建时会占用新的inode号, 不会占用 可以跨分区 不可以跨分区 与源文件是两个不同的文件,不会增加文件链接数 与源文件数据相同,会增加文件链接数 依赖于链接的文件名,当删除或移动源文件后,连接可能失效 不依赖于源文件名,删除或移动源文件后,硬链接依然使用 对文件,目录都可以执行链接操作 只能对文件执行链接操作 大小为指向源文件路径…

    Linux干货 2016-12-05
  • alias——Linux基本命令(4)

    1.     alias别名 (1)查看、设置别名 Linux系统提供了一个有用的工具叫alias,可以让我们将一些需要频繁使用的但又过于冗长的命令设置一个别名,这样一来,以后只需输入一个简短的别名就可以达到同样的作用。 alias显看当前已定义的别名   使用aliasaliname=’comm…

    2017-07-13
  • linux计划任务

    任务计划的分类: 一次性的任务计划:只执行一次 周期性的任务计划:每隔一定的周期去做相同的事情 设置任务计划功能的工具:at和crontab at:专门处理一次性的计划任务 crontab:根据定义的周期信息,循环做一些事情 batch:系统自行选择空闲时间去执行此处指定的任务 At命令: 查看atd状态和启动atd服务及其配置文件路径: centos6:s…

    2017-09-09
  • NFS服务器设置

    一、NFS的相关概念     NFS(Network File System)即网络文件系统的缩写,由Sun公司研发,其目的是为了解决网络文件共享的问题。用户可以实现像挂载本地文件系统一样挂载NFS服务器的共享目录;其具有配置简单、使用高效的特点,但只能在Linux系统使用,不能跨平台使用。 &nb…

    Linux干货 2015-06-25