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

來源:互聯網
上載者:User

標籤:welcome   變數   too   取整   conf   class   輸入資料   入行   工具   

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

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

 

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

 

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

http://blog.csdn.net/dawnstar_hoo/article/details/4043887

 

 

關於特殊符號的參考:

http://www.ahlinux.com/shell/9964.html

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.