shell學習三十二天----read讀取一行
標準輸入輸出與標準錯誤輸出
標準輸入/輸出可能是軟體工具設計原則裡最基本的觀念了.他的構想是:程式應有一個數據來源,資料出口(資料要去哪裡),以及報告問題的地方.他們分別叫做標準輸入,標準輸出和標準錯誤輸出.程式應該不知道也不在意其輸入與輸出背後是另一個執行的程式!程式可以預期,在他啟動的時候,這些標準位置都已開啟,且已經準備好可以使用了.
預設情況下,程式會讀取標準輸入,寫入標準輸出,並將錯誤資訊傳遞給標準錯誤輸出.這樣的程式我們稱為過濾器,因為他們過濾資料流,每一個都會在資料流上執行某種運算,再通過管道,將它傳遞給下一個.
使用read讀取行
read命令是用於從終端或者檔案中讀取輸入的內部命令
語法:
read [-r] variable
用途:將資訊讀入一個或多個shell變數
主要選項:
-r:原始讀取,不作任何處理.不將行結尾處的反斜槓解釋為續行字元.
行為模式:
自標準輸入讀取行(資料)後,通過shell欄位切割的功能(使用$IFS)進行切分.第一個單詞賦值給第一個變數,第二個單詞則賦值給第二個變數,以次類推.如果單詞多於變數,則所有剩下的單詞,全賦值給最後一個變數.read一旦遇到檔案結尾,會以失敗退出.
如果輸入行以反斜槓結尾,則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參考連線:
關於特殊符號的參考: