天天看點

Linux—read

read:将資訊讀入一個或多個Shell變量

    文法格式:read [-r] 變量名

    選項:

        -r:原始讀入,不做任何處理,不将結尾結尾處的反斜杠解釋為續行字元

    行為模式:自标準輸入讀取資料後,通過Shell字段分隔的功能(使用$IFS)進行切分,第一個單詞賦給第一個變量,第二

              個單詞賦給第二個變量,以此類推。如果單詞多與變量,則剩下的單詞,全賦給最後一個變量。read一旦遇到

              檔案結尾(end-of-file),會以失敗值退出。

              如果輸入行以反斜杠結尾,則read會丢棄反斜杠和換行字元,然後繼續讀取下一行。如果有-r選項,那麼read

              就會以字面含義讀取最後的反斜杠。

       linlin@ubuntu:~$ read TOM

       cat

       linlin@ubuntu:~$ echo $TOM

       cat

       linlin@ubuntu:~$ read JERRY MARRY

       dog pear apple

       linlin@ubuntu:~$ echo $JERRY

       dog

       linlin@ubuntu:~$ echo $MARRY

       pear apple

    警告:當将read使用在管道時,許多Shell會在一個分開的程序内執行它,在這種情況下,任何以read設定的變量,都不會

          保留它們在父Shell裡的值,對管道中間的循環,也是這樣。

    read最典型的用法是處理/etc/passwd檔案,可以使用簡單的循環逐行處理:

    #!/bin/bash

  #

  while IFS=: read USER PASS UID GID FULLNAME HOMEDIR SEHLE

  do

    ... 處理每個使用者

  done < /etc/passwd

  這個循環并不是說“當IPS等于冒号時,便讀取。。。”,而是通過IFS設定,讓read使用冒号作為分隔字元,而并不影響IFS

  的值,它隻改變read所繼承的環境内的IFS值。

  當遇到檔案尾時,read會以非零值退出,這個操作會使while循環終止。

  将/etc/passwd的重定向放置于循環體的結尾有點奇怪,不過這是必須的,這樣才能使read在每次循環的時候看到後續的行,

  如果循環寫成:

    while IFS=: read USER PASS UID GID FULLNAME HOMEDIR SEHLE < /etc/passwd

    do

      ... 處理每個使用者

    done

    循環就永遠不會終止,每次循環時,Shell都會在打開/etc/passwd一次,且read隻讀取檔案的第一行。

    這種循環還有另一種替代的方式,就是在管道裡把cat和循環一起使用:

       cat /etc/passwd |

      while IFS=: read USER PASS USERID GROUPID FULLNAME HOMEDIR SEHLE

      do

        處理方式

      done

    小技巧:任何指令都能用來将輸入通過管道傳送給read。當read用在循環中時,這個方法格外有效。