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
    • 失?。籂顟B結果為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.www58058.com/92597

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

相關推薦

  • NTP時間服務器

        在集群環境和需要日志同步的多服務器應用中,為了能夠保證多臺服務器的之間的正常協作,就必須使它們的時間保持一致,在多臺服務器上手動調整時間是極其不科學的,這時就需要借助于NTP時間服務器來完成時間的同步。     一、NTP服務器的安裝    …

    Linux干貨 2015-06-25
  • Linux基礎之軟件包管理

    一.概述 在redhat系列的發行版中,采用rpm軟件包管理器,rpm原名是Red Hat Package Manager,后來當其他發行版也采用這種軟件包管理機制以后,重新命名,改為RPM Package Manager,它所能提供的功能是將編譯好的應用程序文件打包成一個或幾個程序文件,從而使得用戶能夠方便的安裝,升級,卸載軟件,而yum則是rpm包管理器…

    Linux干貨 2016-11-16
  • ?磁盤管理、MBR、GPT、分區工具、文件系統、常見分區掛載

    磁盤管理{磁盤結構;MBR;GPT;分區工具;文件系統;分區掛載;}

    Linux干貨 2016-08-29
  • vsdf

    Linux干貨 2017-10-23
  • keepalived相關配置示例(二)

    虛擬服務器配置實驗: 兩臺centos6主機為web service系統為CentOS6.8 n1:172.16.253.87 n2:172.16.252.5都安裝httpd yum install -y httpd[root@n1 ~]#vim /var/www/html/index.html<h1>Real Server 1</h1&g…

    Linux干貨 2017-06-28
  • 命令,Linux的獨特魅力

    轉眼又學了一個星期,那就來分享一下這個星期所學的知識吧! 這個星期學的都是各種命令,而這些命令就如同windoes里面畫面上的各種選項,沒有這些命令,那么你對它將無從下手。那下面就來看看這些命令的強大功能 help   man help(內部命令幫助),等同于man(外部命令幫助)。當你對一個命令不熟悉時,這兩個命令將是你的救命符 選定一個命令,先…

    2017-07-22
欧美性久久久久