標籤:welcome 變數 too 取整 conf class 輸入資料 入行 工具
標準輸入輸出與標準錯誤輸出
標準輸入/輸出可能是軟體工具設計原則裡最主要的觀念了.他的構想是:程式應有一個資料來源,資料出口(資料要去哪裡),以及報告問題的地方.他們分別叫做標準輸入,標準輸出和標準錯誤輸出.程式應該不知道也不在意其輸入與輸出背後是還有一個啟動並執行程式!程式能夠預期,在他啟動的時候,這些標準位置都已開啟,且已經準備好能夠使用了.
預設情況下,程式會讀取標準輸入,寫入標準輸出,並將錯誤資訊傳遞給標準錯誤輸出.這種程式我們稱為過濾器,由於他們過濾資料流,每個都會在資料流上運行某種運算,再通過管道,將它傳遞給下一個.
使用read讀取行
read命令是用於從終端或者檔案裡讀取輸入的內部命令,read命令讀取整行輸入,每行末尾的分行符號不被讀入.在read後面,假設沒有指定變數名,讀取的資料將被自己主動賦值給特定的變數REPLY.
文法:
read [-r] variable
用途:將資訊讀入一個或多個shell變數
主要選項:
-r:原始讀取,不作不論什麼處理.不將行結尾處的反斜線解釋為續行字元.
行為模式:
自標準輸入讀取行(資料)後,通過shell欄位分割的功能(使用$IFS)進行切分.第一個單詞賦值給第一個變數,第二個單詞則賦值給第二個變數,以次類推.假設單詞多於變數,則全部剩下的單詞,全賦值給最後一個變數.read一旦遇到檔案結尾,會以失敗退出.
假設輸入行以反斜線結尾,則read會丟棄反斜線與分行符號,然後繼續讀取下一行資料.假設使用-r選項,那麼read便會以字面意義讀取最後的反斜線.
警告:
當你將read應用在管道裡時,很多shell會在一個分開的進程內運行它.在這樣的情況下,不論什麼以read所設定的變數,都不會保留他們在父shell裡的值.對管道中間的迴圈,也是這樣.
案例一:
bash代碼:
#!/bin/bash
read -p "input Numbers"
echo $REPLY
運行結果為:input Numbers $REPLY(你所輸入的數字)
案例二:
#!/bin/bash
two()
{
read -p "input 2 numbers" v1 v2
echo $(($v1+$v2))
}
two
運行: ./read1.sh
輸出結果:input 2 numbers 5 6
11
案例三:
#!/bin/bash
read -n 1 -p "Do you want to continue [Y/N] ?
" answer
case $answer in
Y|y)
echo "continue"
;;
N|n)
echo "break"
;;
*)
echo "error"
;;
esac
exit 0
分析:該範例使用了-n選項,-n選項的意思是說後面能夠接受多少個字元的輸入,這裡指定了1表示接受一個字元就退出,也就是說僅僅要按下一個鍵就會馬上接受輸入並將其傳遞給變數.無需按斷行符號符.
案例四:
#!/bin/bash
if read -t 5 -p "please enter your name:" name
then
echo "hello $name,welcome to my world"
else
echo "sorry ,too slow"
fi
exit 0
分析:這裡使用了-t選項,使用read命令會存在潛在的危急.指令碼非常可能會停下來一直等待使用者的輸入.假設不管是否輸入資料指令碼都必須繼續運行,那麼能夠使用-t選項指定一個定時器.-t選項指定read命令等待輸入的秒數.當計數達到-t啟動並執行時間時,read命令返回一個非零退出狀態.-t選項後面指定的是秒數.
案例五:
#!/bin/bashread -s -p "Enter your password:" passecho "your password is $pass"exit 0
分析:s選項可以使read命令中輸入的資料不顯示在監視器上(實際上,資料是顯示的,僅僅是read命令將文本顏色設定成與背景同樣的顏色)。
案例六:
怎樣得到一個僅僅有IP的字串?
/sbin/ifconfig eth0 | grep Bcast | sed -e ‘s/^.* addr:\(.*\) Bcast.*$/\1/‘
想要實現輸入一個IP跟機器上的IP對比,觀察是否存在.
#!/bin/bash
ip=$(/sbin/ifconfig eth0 | grep Bcast | sed -e ‘s/^.* addr:\(.*\) Bcast.*$/\1/‘)
read var
#echo $ip
if [ "$var" = "$ip" ]
then
echo "Ok"
else
echo "no"
fi
分析:回想一下sed命令,sed命令是一種線上編輯器,一次處理一行內容.sed命令的-e選項是說多點編輯,此處相當於:
ifconfig eth0 |grep "inet" | sed ‘s/^.*addr://g‘| sed ‘s/Bcast.*$//g‘
sed參考串連:
http://blog.csdn.net/dawnstar_hoo/article/details/4043887
關於特殊符號的參考:
http://www.ahlinux.com/shell/9964.html
shell學習三十二天----read讀取一行