SHELL指令碼的基礎知識5 顯示資料

2021-06-16 09:10:11 字數 2395 閱讀 8145

每個程序中最多可以有9個開啟檔案的描述符:0——stdin,1——stdout,2——stderr。

(1)stdin

對於終端,stdin就是鍵盤。

使用輸入重定向符號(<)時,就將使用重定向引用的檔案替換標準的輸入檔案描述符。

(2)stdout

對於終端,stdout就是顯示器。

使用輸出重定向符號(>)時,就將使用重定向引用的檔案替換標準的輸出檔案描述符。

還可以使用》,向檔案追加資料。

(3)stderr

shell將錯誤提示資訊與正常輸出資訊分開處理。預設情況下,stderr與stdout都是輸出到顯示器。

有幾種方法可以進行重定向資料

(1)僅重定向錯誤:2>file   (2必須位於》的正前方,2與》之間不能有空格),此時標準輸出不受影響,仍然輸出到顯示器

(2)重定向錯誤和資料:

同時使用兩個重定向輸出到不同檔案,2> file1, 1> file2

輸出到同乙個檔案:&>file

使用指令碼重定向輸出的方法有以下兩種

重定向到某個檔案描述符,必須在編號前加&號。ex:>&2 (>& 間無空格)

然後當這個檔案描述符對應的檔案被重定向後,指令碼對應的重定向輸出內容也同樣被重定向。

可以使用exec命令通知shell在指令碼執行期重定向特定的檔案描述符

ex: exec 1>testout

重定向stdout和stderr後,就無法輕鬆再重定向回原來文字,需要使用技巧(見下方)

同樣使用exec即可,ex:exec 0< file

對於讀取文字資料並使用指令碼處理,這是乙個好方法。

除了0,1,2外,其他3-8都可以用於建立自己的重定向。

同樣是先使用 exec 3>test13out,再將某一行     ……… >&3

可以將stdout等的原位置重定向到備選檔案描述符,然後將該檔案描述符重定向回stdout。

ex:  exec 3>&1

exec 1>file

exec 1>&3

這是一種臨時重定向指令碼檔案輸出然後恢復回普通設定的常用方法

使用上方同樣的方法,可將stdin先儲存,再定向,再恢復

ex:   exec 6<&0

exec 0< testfile

…………

exec 0<&6

可以使用同乙個檔案描述符從乙個檔案讀取資料,同時向這個檔案寫入資料:exec 3<> testfile

內部將維護乙個檔案指標,指示內部的位置,讀取和輸入都將發生在指標上次所指的位置

使用&-進行關閉檔案描述符,ex :exec 3>&- (之後就不可以再使用3了)

如果再開同一檔案,將覆蓋之前資料

使用lsof命令可以列出整個系統上開放的檔案描述符。

可以使用$$確定當前pid,ex: lsof -a -p $$ -d 0,1,2

將stderr重定向到空檔案(/dev/null),則輸出的任何資料都不會儲存,即全部丟失。

使用 cat /dev/null > testfile 就可以快速將testfile中所有資料全部抹除

/tmp目錄專門用於儲存臨時檔案,每次開機時,/tmp下的檔案都將自動刪除。

可以使用mktemp命令,在/tmp下建立乙個唯一的臨時檔案

mktemp 檔名.******就可以在本地目錄建立乙個唯一的檔案

在指令碼中使用mktemp命令,需要使用乙個變數儲存該檔名。

使用mktemp -t就可以在/temp下建立臨時檔案,返回的是完整路徑名

使用mktemp -d就可以在當前目錄下建立臨時目錄

同時將訊息傳送到監視器和檔案,就可以使用tee命令。

ex: tee filename   將stdin的資料同時傳送到stdout,和指定的檔案filename

可以與管道命令配置使用重定向任何命令的輸出:ex: date | tee testfile  

預設情況下,每次使用tee都將覆蓋輸出檔案,使用-a就可以向檔案新增資料

Shell指令碼基礎知識

shell 變數 命名規則 首字元為字母 中間不能有空格,可用下劃線 不能使用標點和bash的關鍵字 賦值 顯示命名 不能加 語句賦值 唯讀變數 readonly variable name 刪除變數 unset varible name 不能刪除唯讀變數 shell字串 字串可以用單引號 雙引號 ...

shell指令碼基礎知識

自定義shell變數時,變數有什麼規格?可以使用字母,數字,下劃線,不能以數字開頭 變數名區分大小寫 賦值時等號兩邊不要有空格 不要使用關鍵字或特殊字元,給同乙個變數多次賦值時,最後一次生效。簡述預定義變數 0 的作用?儲存當前執行的程式pid號 上乙個執行命令的返回狀態 0 當前執行的指令碼名 位...

shell指令碼基礎知識

雖然現在能在linux系統下生存,但是自覺效率太低,和高手有很大的差距。這就是關於linux的知識太過匱乏,有很多事情知道該怎麼做,但是就是沒法在linux下實現,為了提公升工作效率,必須要接觸linux高階技巧 linux的東西比較深,沒法一下學完,所以只要能掌握生信必備的基礎就好了。一些主要的流...