溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

shell 之文件名匹配和命令執(zhí)行(四)

發(fā)布時(shí)間:2020-06-30 19:42:07 來(lái)源:網(wǎng)絡(luò) 閱讀:1799 作者:上帝之子521 欄目:開(kāi)發(fā)技術(shù)

        今天我們來(lái)學(xué)習(xí)下 shell 腳本中的文件名匹配和命令執(zhí)行的順序與結(jié)果。我們學(xué)習(xí)這個(gè)的目的是可以熟悉的在 shell 腳本中寫(xiě)出快速的找到文件的命令。它可以匹配文件名中的任何字符串,匹配文件名中的單個(gè)字符以及匹配文件名中的字母或數(shù)字符號(hào)。

        首先我們來(lái)看看匹配文件的符號(hào)的定義,匹配字符串類型的符號(hào)稱之為元字符。匹配文件名中的任意字符串,同時(shí)也包括空字符串

        舉例:ls /etc/*.conf     ls /etc/h*.co*f。結(jié)果如下

shell 之文件名匹配和命令執(zhí)行(四)

        我們看到成功的匹配到了 /etc 目錄下的 h 開(kāi)頭的 con*f 結(jié)尾的所有文件,那么我們以后在文件的查找中就很方便了。

        下來(lái)我們來(lái)看看?匹配文件,那么它是能匹配文件名中的任何單個(gè)字符

        舉例:ls /etc/hos?.conf    ls /etc/??g.conf。結(jié)果如下所示

shell 之文件名匹配和命令執(zhí)行(四)

        下來(lái)繼續(xù)來(lái)看看 [ ] 匹配文件,[ ... ] 匹配 [ ] 中所包含的任意一個(gè)字符。有兩種匹配方式:a> 雜亂匹配:ls /etc/[wsdcr]syslog.conf;b> 范圍匹配:ls [0-9][a-zA-Z].txt

shell 之文件名匹配和命令執(zhí)行(四)

        我們看到已經(jīng)匹配出來(lái)了。[ !... ] 匹配 [ ] 中非感嘆號(hào)!之后的任意一個(gè)字符,它與上一條規(guī)則剛好相反。舉例:ls [!0-9]*.txt。此條是匹配非數(shù)字開(kāi)頭的后綴名為 txt 的所有文件。如下

shell 之文件名匹配和命令執(zhí)行(四)

       下來(lái)我們來(lái)看看一個(gè)綜合應(yīng)用:查找一個(gè)以數(shù)字開(kāi)頭,接著包括兩個(gè)小寫(xiě)英文字母,然后再接任意兩個(gè)字符的以 .conf 結(jié)尾的文件名。(如:5abcui.conf 是符合條件的)

#! /bin/bash

ls [0-9][a-z][a-z]???.conf

        我們來(lái)看看結(jié)果

shell 之文件名匹配和命令執(zhí)行(四)

        我們?cè)谄綍r(shí)的輸出 log 中通常會(huì)以特定字符+年月日來(lái)進(jìn)行保存,那么我們的創(chuàng)建 log 的方式就如下

shell 之文件名匹配和命令執(zhí)行(四)

        如果我們能熟練的使用匹配字符,那么便可以大大減少在查找文件名上的工作量,這是一種非常有效的模式匹配方法。

        下來(lái)我們接著看看命令執(zhí)行的順序和結(jié)果。我們知道在一般的命令中,它是有返回執(zhí)行結(jié)果的,成功則返回 1,失敗返回 0;同樣的,在Linux中,也是有命令的返回結(jié)果的,只不過(guò)是它比較特殊,成功時(shí)返回 0,失敗時(shí)返回非 0。下來(lái)我們看看示例,如下

shell 之文件名匹配和命令執(zhí)行(四)

        我們看到在 ls abcs.log 時(shí),由于沒(méi)有這個(gè)文件,因此它的返回值為 2(非 0);在 ls 2.txt 時(shí),這個(gè)文件是存在的,因此它的返回值為 0。

        下來(lái)我們來(lái)看看命令的執(zhí)行控制:a> 使用 && 符號(hào);b> 使用 || 符號(hào);c> 命令的組合使用“;”。

        a> 使用 && 符號(hào)

            格式:命令 1 && 命令 2 && ··· ;說(shuō)明:如果命令 1 執(zhí)行成功,那么執(zhí)行命令 2 ···

            舉例:cp /etc/sysctl.conf /mnt/ && echo "Copy file success"

shell 之文件名匹配和命令執(zhí)行(四)

        我們看到在有文件存在的情況下,便執(zhí)行后面的 echo 命令,打印出了 Copy file success。在前面的命令沒(méi)有執(zhí)行成功的情況下,沒(méi)有繼續(xù)執(zhí)行后面的 echo 命令。我們?cè)诰幾g源碼時(shí):./configure && make  && make install ,它的用處是用于腳本的執(zhí)行的調(diào)試。

        b> 使用 || 符號(hào)

            格式:命令 1 || 命令 2 || ···;說(shuō)明:如果 || 左邊的命令執(zhí)行失敗了,那么接著執(zhí)行右邊的命令。

            舉例:cp hello.txt copy.txt || echo "Copy file failed"

shell 之文件名匹配和命令執(zhí)行(四)

        它的用處也是用于支持腳本的執(zhí)行的調(diào)試。

        c> 命令的組合使用

            格式 1:“;”一次下達(dá)兩個(gè)以上的命令

            格式 2:( 命令 1;命令 2;... ) 在當(dāng)前 shell 中執(zhí)行

            格式 3:{ 命令 1;命令 2;... } 在子 shell 中執(zhí)行 

        舉例:

            1、ls /usr/;cd;echo "OK"

shell 之文件名匹配和命令執(zhí)行(四)

            2、(ls; cat a.txt; cd) || echo "success"

shell 之文件名匹配和命令執(zhí)行(四)

        我們看到在 || 后,執(zhí)行前面的命令后,如果執(zhí)行成功則后面的命令不會(huì)執(zhí)行。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI