1. 程式人生 > >Linux命令列與shell指令碼程式設計大全(三)

Linux命令列與shell指令碼程式設計大全(三)

十二、呈現資料

輸入和輸出

    標準檔案描述符

                 0 STDIN 標準輸入

                 1 STDOUT 標準輸出

                 2 STDERR 標準錯誤

    重定向錯誤

                  1.只重定向錯誤

 ls -al badfile 2>test1         ##2>表示只重定向錯誤

                  2.重定向錯誤和資料

ls -al test test2 test3 badtest 2>test4 1>test5

### 2>表示將錯誤重定向到test4檔案,1>表示將標準輸出重定向到test5檔案

ls -al test test3 test4 badtest &> test7

### &>會將所有的輸出傳送到同一個檔案,包括錯誤和資料


在指令碼中重定向輸出

1.臨時重定向

使用輸出重定向符來講輸出資訊重定向到STDERR檔案描述符。在重定向到檔案描述符時,必須在檔案描述符數字前加一個&

2. 永久重定向

使用exec命令告訴shell在指令碼執行期間重定向某個特定檔案描述符。

## 臨時重定向,使用&
echo "this is an error" >&2
echo "this is normal output"

## 永久重定向,使用exec命令
exec 2>testerror #重定向標準錯誤
echo "this is the start of the script" ##正常在螢幕顯示
echo "now redirecting all output to another location" ##同上


exec 1>testout ##重定向標準輸出
echo "this is a test should go to testout file" ##在testout檔案中
echo "this line should go to testerror file" >&2 ##在testerror檔案中

在指令碼中重定向輸入

exec命令允許將STDIN重定向到Linux系統上的檔案中。

exec 0<test14_2.sh ##重定向輸入
count=1
while read line
do 
echo "line #$count : $line"
count=$[ $count + 1 ]
done

建立自己的重定向

## 1 建立輸出檔案描述符
exec 3>testout
echo "this should be stored in the file " >&3
echo "this should be on the screen"
## 2 重定向檔案描述符
exec 3>&1  ##描述符3重定向為描述符1,即STDOUT
exec 1>testout  ##STDOUT重定向到檔案
echo "this should store in the output file"
echo "along with this line"
exec 1>&3 ##STDOUT重定向到顯示器
echo "now things should be back to normal"
## 3 建立輸入檔案描述符
exec 6<&0
exec 0<test14_2.sh
count=1
while read line
do
	echo "line #$count : $line"
	count=$[ $count + 1 ]
done
exec 0<&6
read -p "Are you done now? [Y/N]: " answer
case $answer in
	Y|y) echo "Goodbye" ;;
	N|n) echo "sorry,this is the end." ;;
esac

## 4 檔案讀寫描述符,需要特別小心使用,使用<>
exec 3<>testfile
read line <&3
echo "read : $line"
echo "this is a test line." >&3
## 5 關閉檔案描述符,使用&-,一旦關閉,在指令碼就不能在使用
exec 3>&-

列出開啟檔案描述符

 

## 列出開啟的檔案描述符 lsof命令
## lsof -a -p $$ -d 0,1,2,3,4,5,6,7,8,9
exec 3>testfile1
exec 5<testfile2
exec 8<testfile
/usr/bin/lsof -a -p $$ -d0,1,2,3,5,8

阻止命令輸出

可以將STDERR重定向到一個叫做null檔案的特殊檔案,該檔案位置為/dev/null

ls -al >/dev/null

建立臨時檔案

mktemp testing.XXXXXX

指定一個檔名模板,模板可以包含任意文字檔名,在檔名末尾加上6個X就可以了。mktemp命令會用6個字元替換這6個X,該檔案在系統啟動時不會被刪除。-t選項會強制mktemp命令在系統的臨時目錄建立檔案,使用這個選項,mktemp命令會返回臨時檔案的全路徑,在/tmp目錄中的檔案會在系統啟動時被刪除。-d選項會建立一個臨時目錄

##建立臨時檔案
# 本地臨時檔案 mktemp testing.XXXXXX,mktemp會用6個字元替換這6個X,保證檔名在目錄中是唯一的
# -t選項會強制mktemp命令在/tmp目錄中建立檔案,返回檔案的全路徑,該檔案在系統啟動時會被刪除
# -d選項會建立一個臨時目錄
tempfile=$(mktemp test.XXXXXX)
exec 3>$tempfile
echo "This script writes to temp file $tempfile"
echo "This is the first line" >&3
echo "This is the second line" >&3
echo "This is the thrid line" >&3
exec 3>&-
echo "Done creating temp file.The contents are:"
cat $tempfile
rm -f $tempfile 2> /dev/null

記錄訊息

tee命令可以將輸出同時傳送到顯示器和日誌檔案,命令格式: tee filename,-a選項會將資料追加到檔案中

## 記錄訊息
# tee命令會將輸出同時傳送到顯示器和日誌檔案,用法tee filename
# 例如: date | tee -a testfile
# -a選項會將資料追加到檔案中

十三、控制指令碼

處理訊號

    1.Linux常用訊號

                 訊號                值                        描述

                 1               SIGHUP                掛起程序

                 2               SIGINT                  終止程序

                 3               SIGQUIT               停止程序

                 9               SIGKILL                無條件終止程序

                 15             SIGTERM             儘可能終止程序

                 17             SIGSTOP             無條件停止程序,但不是終止程序

                 18             SIGTSTP              停止或暫停程序,但不終止程序

                 19             SIGCONT             繼續執行停止的程序

    2.生成訊號: 中斷程序 Ctrl+C 暫停程序 Ctrl+Z

##捕獲訊號 
trap commands signals

3.捕獲指令碼退出

trap commands EXIT

4.修改或移除捕獲,如果一個訊號在捕獲被修改前接收到,指令碼仍然會根據最初的trap命令進行處理。

## 使用trap捕獲訊號
trap "echo 'sorry,I have trapped ctrl-c'" SIGINT
count=1
while [ $count -le 10 ]
do
	echo "Loop #$count"
	sleep 1
	count=$[ $count + 1 ]
done
# 修改捕獲,捕獲指令碼退出
trap "echo goodbye..." EXIT
# 移除捕獲
trap -- SIGINT

以後臺模式執行指令碼

    1.後臺執行指令碼,在命令後加上 & 符就可以了,終端會話推出,後臺程序也會隨之退出。

    2.在非控制檯下執行指令碼,使用nohup命令

nohup ./test1.sh &

作業控制

    1.檢視作業: jobs ,帶加號的作業會被當作預設作業,帶減號的作業為下一個預設作業,任何時候只有一個帶加號的作業和一個帶減號的作業

    2.重啟停止的作業 :

後臺模式重啟: bg 加作業號

前臺模式重啟: fg 加作業號

調整謙讓度

排程優先順序從-20(最高優先順序)到+19(最低優先順序),預設情況下,shell以優先順序0啟動所有程序

1. nice命令讓命令以更低的優先順序執行,不能調高優先順序:

nice -n 10 ./test4.sh> test4.out &(或者可以直接去掉n)

nice -10 ./test4.sh> test4.out &(直接去掉n)

2. renice命令:改變系統上已經執行命令的優先順序

renice -n 10 -p 5055    ##(5055程序優先順序調低到10)

# 只能對屬於你的程序執行renice

# 只能通過renice降低程序的優先順序

# root使用者可以通過renice來任意調整程序的優先順序(可以調高優先順序)

定時執行作業

    1. at命令

    基本格式 at [-f filename] time

    時間格式: 標準的小時和分鐘格式,如10:15

         AM/PM指示符,如10:15 PM

         特定可命名時間,如now,noon,midnight,teetime

         標準日期格式,如MMDDYY,MM/DD/YY或DD.MM.YY

         文字格式如Jul 4或Dec 25

         指定時間增量 當前時間+25min, 明天10:15pm,10:17+7天

    atq可以檢視系統中有哪些作業在等待

    atrm可以刪除等待中的作業

    2.需要定期執行的指令碼

    -- cron時間表

    格式: min hour dayofmonth month dayofweek command1

    允許使用特定值、取值範圍、或者萬用字元來指定條目。

   -- 構建cron時間表      crontab -l

   -- 瀏覽cron目錄

    /etc/目錄下有四個基本目錄.hourly,daily,weekly,monthly,如果指令碼需要每天執行一次,吧指令碼複製到daily目錄就可以了

   -- anacron程式

某作業由於關機錯過了執行時間,anacron會盡快執行該作業,只會處理位於cron目錄,一般在/etc/anacrontab檔案中

格式 : period delay identifier command

peroid定義作業多久執行一次,以天為單位,identifier條目是一種特別的非空字串,用於唯一標識日誌錯誤和錯誤郵件中的作業。command條目包含了run-parts程式和一個cron指令碼目錄名。

使用新shell啟動指令碼

使用者登入會按照順序查詢如下檔案,當找到順序值低的檔案時,不再繼續查詢:

$HOME./bashrc,$HOME/.bash_profile,$HOME/.bash_login,$HOME/.profile