shell程式設計(1)

來源:互聯網
上載者:User

shell程式設計(1)管道和重新導向重新導向重新導向輸出

chen123@ubuntu:~/C++$ ls -l >lsoutput.txt

這條命令把ls命令的輸出儲存到檔案lsoutput.txt中。

檔案描述符0代表一個程式的標準輸入,檔案描述符1代表標準輸出,檔案描述符2代表標準錯誤輸出。在上面的例子中,通過>操作符把標準輸出重新導向到一個檔案。預設情況下,如果該檔案已經存在,它的內容將被覆蓋。使用set –C命令設定noclobber選項,從而阻止重新導向操作對一個已有檔案的覆蓋。也可以使用set +o noclobber或set -o noclobber開啟或關閉noclobber選項。

我們使用>>操作符將輸出內容附加到一個檔案中,例如

chen123@ubuntu:~/C++$ ps >>lsoutput.txt

這條命令將ps的輸出附加到指定檔案的尾端。

如果需要對標準錯誤輸出重新導向,可以使用2>操作符。因為標準錯誤輸出檔案描述符是2,所以在>前面加上2。

下面這條命令是把標準輸出和標準錯誤輸出分別重新導向到不同的檔案中

chen123@ubuntu:~/C++$ kill -HUP 1234>killout.txt 2>killerr.txt

如果想把兩組輸出都重新導向到一個檔案中,可以用>&操作符來結合兩個輸出。

chen123@ubuntu:~/C++$ kill -l 1234 > killouterr.txt2>&1

這條命令將標準輸出重新導向到killouterr.txt,然後將標準錯誤輸出重新導向到與標準輸出相同的地方。

可以直接使用UNIX的同樣資源回收筒/dev/null來有效地丟棄所以輸出資訊

chen123@ubuntu:~/C++$ kill -l 1234>/dev/null 2>&1

重新導向輸入

chen123@ubuntu:~/C++$ more < killerr.txt

很明顯,這樣做一樣不大,因為more可以直接接受檔案名稱作為參數。

chen123@ubuntu:~/C++$ more killerr.txt

管道

在linux下通過管道串連的進程可以同時運行,並且隨著資料流在他們之間的傳遞可以自動的進行協調。舉一個例子我們可以使用sort命令對ps命令的輸出進行排序。

如果我們不使用管道,這就需要分幾個步驟實現

chen123@ubuntu:~/C++$ ps > psout.txt

chen123@ubuntu:~/C++$ sort psout.txt >pssort.out

但如果使用管道更為精巧。

chen123@ubuntu:~/C++$ ps | sort >pssort1.out

如果想在螢幕上分頁顯示輸出結果,我們可以在連接第三個進程more,將他們都放在同一個命令列上。

chen123@ubuntu:~/C++$ ps | sort | more

如果有一系列的命令需要執行,相應的輸出檔案是在這一組命令被建立的同時立刻被建立或寫入的,所以決不要在命令流中重複使用相應的檔案名稱。如果嘗試執行如下命令

chen123@ubuntu:~/C++$ cat mydata.txt | sort| uniq | > mydata.txt

你最終將得到一個空檔案,因為你在讀取檔案mydata.txt之前就已經覆蓋了這個檔案的內容。

作為程式設計語言的shell

編寫shell指令碼程式有兩種方式。可以輸入一系列命令讓shell互動的執行它們,也可以把這些命令儲存到一個檔案中,然後將該檔案作為一個程式來調用。

互動式程式

假設我們尋找包含字串hello的檔案,可使用下面的互動式指令碼來執行整個操作:

chen123@ubuntu:~/C++$ for file in *

> do

> if grep -l hello $file

> then

> more $file

> fi

> done

請注意,在輸入shell命令的時候,shell提示符$會變成>符號。可以一直輸入下去,由shell來判斷何時輸入完畢並立刻執行指令碼程式。

建立指令碼

首先用文字編輯器建立一個名為first的檔案,其內容如下:

#!/bin/sh

#first

#This file looks through all the files inthe current

#directory for the string hello, and thenprints the names of

#those files to the standard output.

for file in *

do

ifgrep -q hello $file

then

echo$file

fi

done

exit0

其中#!字元告訴系統同一行緊跟在它後面的那個參數是用來執行文本的程式。

exit命令的作用是確保程式能夠返回一個有意義的退出碼。

可以用file命令來檢查檔案是否是指令碼程式。

chen123@ubuntu:~/C++$ file first

first: POSIX shell script text executable

執行指令碼

運行指令碼的方法有兩種

方法1:

chen123@ubuntu:~/C++$ /bin/bash first

方法2:

chen123@ubuntu:~/C++$ ./first

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.