標(biāo)準(zhǔn)輸入/輸出可能是軟件工具設(shè)計原則里最基本的觀念了。他的構(gòu)想是:程序應(yīng)有一個數(shù)據(jù)來源,數(shù)據(jù)出口(數(shù)據(jù)要去哪里),以及報告問題的地方。他們分別叫做標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出。程序應(yīng)該不知道也不在意其輸入與輸出背后是另一個執(zhí)行的程序!程序可以預(yù)期,在他啟動的時候,這些標(biāo)準(zhǔn)位置都已打開,且已經(jīng)準(zhǔn)備好可以使用了。
默認(rèn)情況下,程序會讀取標(biāo)準(zhǔn)輸入,寫入標(biāo)準(zhǔn)輸出,并將錯誤信息傳遞給標(biāo)準(zhǔn)錯誤輸出。這樣的程序我們稱為過濾器,因為他們過濾數(shù)據(jù)流,每一個都會在數(shù)據(jù)流上執(zhí)行某種運算,再通過管道,將它傳遞給下一個。
使用 read 讀取行
read 命令是用于從終端或者文件中讀取輸入的內(nèi)部命令,read 命令讀取整行輸入,每行末尾的換行符不被讀入。在 read 后面,如果沒有指定變量名,讀取的數(shù)據(jù)將被自動賦值給特定的變量 REPLY。
語法:
read [-r] variable
用途:將信息讀入一個或多個 shell 變量
主要選項:
-r:原始讀取,不作任何處理。不將行結(jié)尾處的反斜杠解釋為續(xù)行字符。行為模式:
自標(biāo)準(zhǔn)輸入讀取行 (數(shù)據(jù)) 后,通過 shell 字段切割的功能 (使用 $IFS) 進(jìn)行切分。第一個單詞賦值給第一個變量,第二個單詞則賦值給第二個變量,以次類推。如果單詞多于變量,則所有剩下的單詞,全賦值給最后一個變量。read 一旦遇到文件結(jié)尾,會以失敗退出。
如果輸入行以反斜杠結(jié)尾,則 read 會丟棄反斜杠與換行符,然后繼續(xù)讀取下一行數(shù)據(jù)。如果使用 -r 選項,那么 read 便會以字面意義讀取最后的反斜杠。
警告:
當(dāng)你將 read 應(yīng)用在管道里時,許多 shell 會在一個分開的進(jìn)程內(nèi)執(zhí)行它。在這種情況下,任何以 read 所設(shè)置的變量,都不會保留他們在父 shell 里的值。對管道中間的循環(huán),也是這樣。
案例一:
bash 代碼:
\#!/bin/bash
read -p "input Numbers"
echo $REPLY
執(zhí)行結(jié)果為:input Numbers $REPLY(你所輸入的數(shù)字)
案例二:
\#!/bin/bash
two()
{
read -p "input 2 numbers" v1 v2
echo $(($v1+$v2))
}
two
執(zhí)行:./read1.sh
輸出結(jié)果:
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 命令會存在潛在的危險。腳本很可能會停下來一直等待用戶的輸入。如果無論是否輸入數(shù)據(jù)腳本都必須繼續(xù)執(zhí)行,那么可以使用 -t 選項指定一個定時器。-t 選項指定 read 命令等待輸入的秒數(shù)。當(dāng)計數(shù)達(dá)到 -t 執(zhí)行的時間時,read 命令返回一個非零退出狀態(tài)。-t 選項后面指定的是秒數(shù)。
案例五:
\#!/bin/bashread -s -p "Enter your password:" passecho "your password is $pass"exit 0
分析:s 選項能夠使 read 命令中輸入的數(shù)據(jù)不顯示在監(jiān)視器上(實際上,數(shù)據(jù)是顯示的,只是 read 命令將文本顏色設(shè)置成與背景相同的顏色)。
案例六:
如何得到一個只有 IP 的字符串?
/sbin/ifconfig eth0 | grep Bcast | sed -e 's/^.* addr:.? Bcast.*$/\1/'
想要實現(xiàn)輸入一個 IP 跟機(jī)器上的 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 命令是一種在線編輯器,一次處理一行內(nèi)容。sed 命令的 -e 選項是說多點編輯,此處相當(dāng)于:
ifconfig eth0 |grep "inet" | sed 's/^.*addr://g'| sed 's/Bcast.*$//g'
sed 參考連接:
http://blog.csdn.net/dawnstar_hoo/article/details/4043887
關(guān)于特殊符號的參考:
http://www.ahlinux.com/shell/9964.html