鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)第三十二天----read 讀取一行
shell 學(xué)習(xí)四十一天----列出文件 ls 和 od 命令
shell 學(xué)習(xí)小結(jié)
shell 學(xué)習(xí)第二十八天----case 語(yǔ)句
shell 學(xué)習(xí)四十四天----尋找文件
shell 學(xué)習(xí)三十五天----波浪號(hào)展開(kāi)與通配符
shell 學(xué)習(xí)三十八天----執(zhí)行順序和 eval
shell 學(xué)習(xí)四十八天----文件校驗(yàn)和匹配
shell 學(xué)習(xí)四十天----awk 的驚人表現(xiàn)
shell 學(xué)習(xí)第十一天----sed 正則的精確控制
shell 學(xué)習(xí)第十七天----awk 命令
shell 學(xué)習(xí)三十九天----內(nèi)建命令
shell 學(xué)習(xí)四十五天----xargs
shell 學(xué)習(xí)三十七天----引用
shell 學(xué)習(xí)第十六天----join 練習(xí)
shell 學(xué)習(xí)第二十四天----提取開(kāi)頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第九天----分組
shell 學(xué)習(xí)第五天----基本的 I/O 重定向
shell 學(xué)習(xí)第十五天----使用 cut 選定字段
shell 學(xué)習(xí)四十六天----文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)第八天----擴(kuò)展正則表達(dá)式 (ERE)
shell 學(xué)習(xí)第十九天----文本塊排序
shell 學(xué)習(xí)第二十一天----重新格式化段落
shell 學(xué)習(xí)三十六天----命令替換
shell 學(xué)習(xí)第二十天----sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)四十二天----使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)五十一天----top 命令查看進(jìn)程列表
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)五十四天----進(jìn)程系統(tǒng)調(diào)用的追蹤 strace
shell 學(xué)習(xí)五十天----查看進(jìn)程 ps 命令
shell 學(xué)習(xí)第二十七天----退出狀態(tài)和 if 語(yǔ)句
shell 學(xué)習(xí)第二十三天----打印
shell 學(xué)習(xí)三十三天----關(guān)于重定向
shell 學(xué)習(xí)四十九天----進(jìn)程建立
shell 學(xué)習(xí)第三十天----break,continue,shift,getopts
shell 學(xué)習(xí)五十五天----進(jìn)程記賬
shell 學(xué)習(xí)總結(jié)一
shell 學(xué)習(xí)第二十六天----變量與算數(shù)
shell 學(xué)習(xí)第二十二天----計(jì)算行數(shù), 字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)五十八天----/proc 文件系統(tǒng)
shell 學(xué)習(xí)第二十五天----神器的管道符
shell 學(xué)習(xí)第三十二天----read 讀取一行
sheel 學(xué)習(xí)第三天
shell 學(xué)習(xí)----小結(jié)
shell 學(xué)習(xí)第十八天----文本排序
shell 學(xué)習(xí)第三十一天----函數(shù)問(wèn)題
shell 學(xué)習(xí)第十天----sed 查找與替換
shell 學(xué)習(xí)四十三天----臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)四十七天----文件比較 cmp,diff,patch
shell 學(xué)習(xí)三十四天----printf 詳解
shell 學(xué)習(xí)五十七天 ----linux 任務(wù)管理,針對(duì)上一講的總結(jié)和擴(kuò)展
shell 學(xué)習(xí)第六天----小結(jié)
shell 學(xué)習(xí)第十三天----sed 案例分析
shell 學(xué)習(xí)第七天----基礎(chǔ)正則表達(dá)式 (BRE)
shell 學(xué)習(xí)第十二天----行與字符串
shell 學(xué)習(xí)小結(jié)四
shell 學(xué)習(xí)第二十九天----循環(huán)
shell 學(xué)習(xí)五十二天----刪除進(jìn)程 kill 命令
shell 學(xué)習(xí)五十六天----延遲進(jìn)程調(diào)度
shell 學(xué)習(xí)第四天----華麗的 printf 輸出
shell 學(xué)習(xí)第十五天----join 連接字段
shell 學(xué)習(xí)完結(jié)篇----希望你能看到
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)五十三天----捕獲信號(hào) trap

shell 學(xué)習(xí)第三十二天----read 讀取一行

標(biāo)準(zhǔn)輸入輸出與標(biāo)準(zhǔn)錯(cuò)誤輸出

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

默認(rèn)情況下,程序會(huì)讀取標(biāo)準(zhǔn)輸入,寫入標(biāo)準(zhǔn)輸出,并將錯(cuò)誤信息傳遞給標(biāo)準(zhǔn)錯(cuò)誤輸出。這樣的程序我們稱為過(guò)濾器,因?yàn)樗麄冞^(guò)濾數(shù)據(jù)流,每一個(gè)都會(huì)在數(shù)據(jù)流上執(zhí)行某種運(yùn)算,再通過(guò)管道,將它傳遞給下一個(gè)。

使用 read 讀取行

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

語(yǔ)法:

read [-r] variable

用途:將信息讀入一個(gè)或多個(gè) shell 變量

主要選項(xiàng):

  • -r:原始讀取,不作任何處理。不將行結(jié)尾處的反斜杠解釋為續(xù)行字符。

行為模式:

自標(biāo)準(zhǔn)輸入讀取行 (數(shù)據(jù)) 后,通過(guò) shell 字段切割的功能 (使用 $IFS) 進(jìn)行切分。第一個(gè)單詞賦值給第一個(gè)變量,第二個(gè)單詞則賦值給第二個(gè)變量,以次類推。如果單詞多于變量,則所有剩下的單詞,全賦值給最后一個(gè)變量。read 一旦遇到文件結(jié)尾,會(huì)以失敗退出。

如果輸入行以反斜杠結(jié)尾,則 read 會(huì)丟棄反斜杠與換行符,然后繼續(xù)讀取下一行數(shù)據(jù)。如果使用 -r 選項(xiàng),那么 read 便會(huì)以字面意義讀取最后的反斜杠。

警告:

當(dāng)你將 read 應(yīng)用在管道里時(shí),許多 shell 會(huì)在一個(gè)分開(kāi)的進(jìn)程內(nèi)執(zhí)行它。在這種情況下,任何以 read 所設(shè)置的變量,都不會(huì)保留他們?cè)诟?shell 里的值。對(duì)管道中間的循環(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 選項(xiàng),-n 選項(xiàng)的意思是說(shuō)后面可以接受多少個(gè)字符的輸入,這里指定了 1 表示接受一個(gè)字符就退出,也就是說(shuō)只要按下一個(gè)鍵就會(huì)立即接受輸入并將其傳遞給變量。無(wú)需按回車符。

案例四

\#!/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 選項(xiàng),使用 read 命令會(huì)存在潛在的危險(xiǎn)。腳本很可能會(huì)停下來(lái)一直等待用戶的輸入。如果無(wú)論是否輸入數(shù)據(jù)腳本都必須繼續(xù)執(zhí)行,那么可以使用 -t 選項(xiàng)指定一個(gè)定時(shí)器。-t 選項(xiàng)指定 read 命令等待輸入的秒數(shù)。當(dāng)計(jì)數(shù)達(dá)到 -t 執(zhí)行的時(shí)間時(shí),read 命令返回一個(gè)非零退出狀態(tài)。-t 選項(xiàng)后面指定的是秒數(shù)。

案例五

\#!/bin/bashread  -s  -p "Enter your password:" passecho "your password is $pass"exit 0 

分析:s 選項(xiàng)能夠使 read 命令中輸入的數(shù)據(jù)不顯示在監(jiān)視器上(實(shí)際上,數(shù)據(jù)是顯示的,只是 read 命令將文本顏色設(shè)置成與背景相同的顏色)。

案例六

如何得到一個(gè)只有 IP 的字符串?

/sbin/ifconfig eth0 | grep Bcast | sed -e 's/^.* addr:.? Bcast.*$/\1/'

想要實(shí)現(xiàn)輸入一個(gè) IP 跟機(jī)器上的 IP 對(duì)照,觀察是否存在。

\#!/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 選項(xiàng)是說(shuō)多點(diǎn)編輯,此處相當(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)于特殊符號(hào)的參考:
http://www.ahlinux.com/shell/9964.html