1. 程式人生 > >shell學習三十二天----read讀取一行

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

標準輸入輸出與標準錯誤輸出

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

預設情況下,程式會讀取標準輸入,寫入標準輸出,並將錯誤資訊傳遞給標準錯誤輸出.這樣的程式我們稱為過濾器,因為他們過濾資料流,每一個都會在資料流上執行某種運算,再通過管道,將它傳遞給下一個.

使用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參考連線:

關於特殊符號的參考: