shell中組合命令的方法

2022-06-24 06:57:09 字數 1826 閱讀 9084

參考:

在shell中,有兩種組合命令的方法,在介紹這兩種方法之前,我們先來看乙個小示例。

目前有兩個目錄,這兩個目錄分別為/test1和/test2,目錄中分別存在如下檔案。

[root@node1 ~]# ls /test1

t1 t2 t3

[root@node1 ~]# ls /test2

t4[root@node1 ~]#

此刻,如果我們想要統計這兩個目錄中一共有多少個檔案,該怎樣編寫shell呢,編寫如下的shell命令,能夠達到目的嗎?

[root@node1 ~]# ls /test1;ls /test2 | wc -l

上述命令是無法統計出兩個目錄中的檔案數量的,因為執行結果如下。

[root@node1 ~]# ls /test1;ls /test2 | wc -l

t1 t2 t3

1[root@node1 ~]#

從上述執行結果可以看出,前兩條命令並沒有一起執行,而是第一條命令執行完畢後,再把後面的命令當做乙個整體執行了,即執行了第一條命令顯示了資料夾/test1下三個檔名 然後把ls /test2 | wc -l作為一條語句執行了列印了資料夾下面多少個檔案數即1

那麼如果我們想要讓前兩條命令當做乙個整體執行,該怎樣做呢?

[root@node1 ~]# (ls /test1;ls test2)| wc -l

4[root@node1 ~]# | wc -l

4[root@node1 ~]#

上圖中,我們分別使用小括號"( )" 與 大括號""將前兩個命令組合在了一起。兩種方法都能達到我們的目的,但是,這兩種方法是有所不同的,先說說第一種,當使用"小括號"將兩條命令括起以後,這兩條命令相當於在當前shell的子shell中執行,也就是說,這兩條命令並不是在當前程序中執行的,而是在當前程序的子程序中執行的,而使用"大括號"時則不同,被大括號括起的命令是在當前程序中執行的。那麼,我們怎樣證明上述理論呢,我們可以做乙個小實驗,如下圖。

[root@node1 ~]# (cd;exit)

[root@node1 ~]#

登出connection closing...socket close.

connection closed by foreign host.

disconnected from remote host(local-iptables-test-001146) at 13:43:46.

type `help' to learn how to use xshell prompt.

[c:\~]$

當我們使用小括號將命令聚合以後,因為是在子程序中執行,所以即使exit命令生效,也是退出子程序,而不是退出當前shell程序,但是如果使用大括號將命令組合,則表示在當前shell程序中執行命令,所以,當exit命令生效時,則會退出當前shell程序。

好了,這就是使用"大括號"與使用"小括號"的不同之處,其實,在使用大括號時,還需要注意一些額外的注意點,細心如你一定已經發現了,上述所有使用"大括號"的示例中,大括號內的所有命令都用空格隔開了,而且大括號內的每個命令都必須以分號";"結尾,即使是大括號內的最後乙個命令,也需要以分號結尾,而且需要用空格與大括號隔開,這就是使用這種方法的注意點,其實,這種用大括號聚合命令的方法是使用了函式中"**塊"的語法,在函式中,乙個函式的**塊就會用大括號括起,表示是乙個函式的整體,此處我們也可以這樣理解,我們將多個命令用大括號括起,表示他們是乙個**塊,是乙個整體,我們可以把這種沒有函式名只有函式體的**塊理解為匿名函式,當然,如果你還不了解shell的函式,沒有關係,只需要記住這種用法即可。

shell的命令替換和命令組合

bash shell系列文章 linux中使用反引號 在波浪線的按鍵上 或者 來執行命令替換。使用括號 來組合一系列命令。root xuexi echo what date it is?date f what date it is?2016 09 25 root xuexi tmp echo wha...

shell中的type命令

type aftpp name name,a 列印name的所有可能情況,比如type a ls,會列印ls is aliased to ls color auto 和ls is bin ls f 不會去查詢function t 列印alias,keyword,function,built in,f...

shell中的expr命令

expr 可以進行的操作如下 邏輯操作 arg1 arg2 邏輯或操作,真則返回arg1,否則返回arg2 以null或者0來判斷引數的真假,有短路功能 arg1 arg2 邏輯與操作,真則返回arg1,否則返回arg2 以null或者0來判斷引數真假,有短路功能 關係操作 arg1 arg2 或者...