鍍金池/ 教程/ Linux/ shell 學習三十二天---read 讀取一行
shell 學習四十五天---xargs
shell學習第三天
shell 學習十五天---join 連接字段
shell 學習第二天
shell 學習四十三天---臨時性文件的建立與使用
shell 學習第六天---小結(jié)
shell 學習三十三天---關于重定向
shell 學習二十九天---循環(huán)
shell 學習二十四天---提取開頭或結(jié)尾數(shù)行
shell 學習第十天---sed 查找與替換
shell 學習第十一天---sed 正則的精確控制
shell 學習三十天---break,continue,shift,getopts
shell 學習---小結(jié)
shell 學習三十一天---函數(shù)問題
shell 學習第四天---華麗的 printf 輸出
shell 學習三十五天---波浪號展開與通配符
shell 學習十九天---文本塊排序
shell 學習十二天---行與字符串
shell 學習二十一天---重新格式化段落
shell 學習十八天---文本排序
shell 學習十三天---sed 案例分析
shell 學習四十一天---列出文件 ls 和 od 命令
shell 學習十七天---awk 命令
shell 學習三十六天---命令替換
shell 學習十六天---join 練習
shell 學習三十二天---read 讀取一行
shell 學習二十二天---計算行數(shù),字數(shù)以及字符數(shù)
shell 學習小總結(jié)---本章小結(jié)
shell 學習第八天---擴展正則表達式(ERE)
shell 學習四十二天---使用 touch 更新文件時間
shell 學習二十八天---case 語句
shell 學習三十九天---內(nèi)建命令
shell 學習第一天
shell 學習三十四天---printf 詳解
shell 學習二十六天---變量與算數(shù)
shell 學習三十八天---執(zhí)行順序和 eval
shell 學習四十四天---尋找文件
shell 學習二十五天---神器的管道符
shell 學習十四天---使用 cut 選定字段
shell 學習第五天---基本的I/O重定向
shell 學習四十天---awk 的驚人表現(xiàn)
shell 學習二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學習二十三天---打印
shell 學習第九天---分組
shell 學習四十八天---文件校驗和匹配
shell 學習二十七天---退出狀態(tài)和 if 語句
shell 學習四十七天---文件比較 cmp,diff,patch
shell 學習第七天---基礎正則表達式(BRE)
shell 學習四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學習三十七天---引用
shell 學習小結(jié)

shell 學習三十二天---read 讀取一行

標準輸入/輸出可能是軟件工具設計原則里最基本的觀念了.他的構(gòu)想是:程序應有一個數(shù)據(jù)來源,數(shù)據(jù)出口(數(shù)據(jù)要去哪里),以及報告問題的地方.他們分別叫做標準輸入,標準輸出和標準錯誤輸出.程序應該不知道也不在意其輸入與輸出背后是另一個執(zhí)行的程序!程序可以預期,在他啟動的時候,這些標準位置都已打開,且已經(jīng)準備好可以使用了.

默認情況下,程序會讀取標準輸入,寫入標準輸出,并將錯誤信息傳遞給標準錯誤輸出.這樣的程序我們稱為過濾器,因為他們過濾數(shù)據(jù)流,每一個都會在數(shù)據(jù)流上執(zhí)行某種運算,再通過管道,將它傳遞給下一個.

使用 read 讀取行
read 令是用于從終端或者文件中讀取輸入的內(nèi)部命令,read 命令讀取整行輸入,每行末尾的換行符不被讀入.在 read 后面,如果沒有指定變量名,讀取的數(shù)據(jù)將被自動賦值給特定的變量 REPLY.
語法:

read [-r] variable  

用途:將信息讀入一個或多個 shell 變量
主要選項:
-r:原始讀取,不作任何處理.不將行結(jié)尾處的反斜杠解釋為續(xù)行字符.
行為模式:
自標準輸入讀取行(數(shù)據(jù))后,通過 shell 字段切割的功能(使用$IFS)進行切分.第一個單詞賦值給第一個變量,第二個單詞則賦值給第二個變量,以次類推.如果單詞多于變量,則所有剩下的單詞,全賦值給最后一個變量.read 一旦遇到文件結(jié)尾,會以失敗退出.
如果輸入行以反斜杠結(jié)尾,則 read 會丟棄反斜杠與換行符,然后繼續(xù)讀取下一行數(shù)據(jù).如果使用-r 選項,那么 read 便會以字面意義讀取最后的反斜杠.

警告:
當你將 read 應用在管道里時,許多 shell 會在一個分開的進程內(nèi)執(zhí)行它.在這種情況下,任何以 read 所設置的變量,都不會保留他們在父 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ù).當計數(shù)達到-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 命令將文本顏色設置成與背景相同的顏色)。
案例六:
如何得到一個只有 IP 的字符串?
/sbin/ifconfig eth0 | grep Bcast | sed -e 's/^.* addr:.? Bcast.*$/\1/'

想要實現(xiàn)輸入一個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 命令是一種在線編輯器,一次處理一行內(nèi)容.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