Linux Bash Shell學習(十九):String I/O——read

來源:互聯網
上載者:User

  本文也即《Learning the bash Shell》3rd Edition的第七章Input/Output and Command-Line Processing之讀書筆記之三。我們的目的是把書讀薄。

  之前學習的echo和printf都是寫,讀使用read,格式為:

read var1 var2...

  多個參數值的讀取,採用IFS。如果我們給出的值多與參數的數目,則多出來的值將都賦予最後一個承諾書,如果你不想為後續的值賦值,可以直接採用斷行符號來終止read的操作。在shell中read可以將pipe後的輸出作為輸入,賦值到某個參數中,可以逐行逐行處理檔案。一般寫為:

while (read a line) do

    process the line

    print the processed line

end

 

逐行讀檔案

  如果read沒有讀到任何,exit status為1(非0)。檔案可以通過重新導向方式進行輸入。例如我們通過命令test來對檔案file進行處理,參見Linux Bash Shell學習(十七):I/O重新導向

,可以通過:

  • ./test < file
  • cat file | ./test

  假設file每行有兩個參數,我們希望逐行讀,並逐行將者兩個參數賦值到x,y變數中。

function wei_test0

{

        echo "Test 'Read'"

        while read x y; do

                echo "x=$x y=$y"

        #done < file 通過對允許的I/O重新導向方式。

        done 
#}<file 也可以通過這種方式,在function後面通過I/O重新導向進行。

}

# 請注意,這種I/O重新導向方式,並不是通過$*,$1,$@,我們可以在函數中用$#來檢查,為0,這幾種方式用於參數輸入,而不用重新導向。<file,將file作為標準輸入。 下面表示subshell的重新導向方式。

wei_test0 < file

cat file | wei_test0

  上面的例子中,在指令檔裡面,我們通過兩種不同的重新導向方式分別實驗。重新導向不僅可以針對命令,也可以針對指令碼中的subshell,function,語句,其優先順序以最靠近read的優先。除了這三種方式外,還可以使用command block。command block是多個語句的組合,用{ },將這些語句括起來,方式和C語言一樣。可以重用{… …} < file的方式。

  上面的例子可以複雜一些,在檔案中,在行的前面加上#表示注釋。在讀的時候,我們需要忽略這些注釋。

function wei_test0

{

        echo "Test 'Read' $#"

        while read x y; do

               if [ -z $(echo $x | grep '^#') ]; then

                        echo "x=$x y=$y"

                fi

        done

}

  grep的使用方法,參見Linux Bash Shell學習(十四):命令列選項

使用者輸入

  下面是最為常用的一種方式,給出提示資訊,然後讀入參數:

echo -n 'Input you value here: '

read my_value

  如果我們希望提示符不顯示在strout,而是現實在stderr,可以在echo –n ‘….’ > &2,將輸出詳細檔案描述符2,即stderr。

Read的一些選項

 Read可以帶有-a, -d, -e, -n, -p, -r, -t, 和 -s八個選項。

-a

:將內容讀入到數值中

echo -n "Input muliple values into an array:"

read -a array

echo "get ${#array[@]} values in array"

-d

:表示delimiter,即定界符,一般情況下是以IFS為參數的間隔,但是通過-d,我們可以定義一直讀到出現執行的字元位置。例如read –d madfds value,讀到有m的字元的時候就不在繼續向後讀,例如輸入為 hello m,有效值為“hello”,請注意m前面的空格等會被刪除。這種方式可以輸入多個字串,例如定義“.”作為結符號等等。

-e

:只用於互相互動的指令碼,它將readline用於收集輸入行。讀到這幾句話不太明白什麼意思,先跳過。

-n

:用於限定最多可以有多少字元可以作為有效讀入。例如echo –n 4 value1 value2,如果我們試圖輸入12 34,則只有前面有效12 3,作為輸入,實際上在你輸入第4個字元‘3’後,就自動結束輸入。這裡結果是value為12,value2為3。

-p

:用於給出提示符,在前面的例子中我們使用了echo –n “…“來給出提示符,可以使用read –p ‘… my promt?’value的方式只需一個語句來表示。

-r

:在參數輸入中,我們可以使用’/’表示沒有輸入完,換行繼續輸入,如果我們需要行最後的’/’作為有效字元,可以通過-r來進行。此外在輸入字元中,我們希望/n這類特殊字元生效,也應採用-r選項。

-s

:對於一些特殊的符號,例如箭頭號,不將他們在terminal上列印,例如read –s key,我們按游標,在斷行符號之後,如果我們要求顯示,即echo,游標向上,如果不使用-s,在輸入的時候,輸入處顯示^[[A,即在terminal上列印,之後如果要求echo,游標會上移。

-t

:用於表示等待輸入的時間,單位為秒,等待時間超過,將繼續執行後面的指令碼,注意不作為null輸入,參數將保留原有的值。

相關連結: 我的Linux操作相關文章

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.