shell腳本編程-處理輸入輸出


一、讀取用戶輸入

(1)基本的讀取命令
    read命令接受從標准輸入或文件描述符的輸入,並將接收到的數據賦值到一個變量。
1 $ cat read.sh 
2 #!/bin/bash
3 # test the read command
4 echo -n "please input your name: "
5 read name
6 echo "Hello $name"
    read命令的-p選項,可以直接在read命令行指定提示符,如上一例子可以寫為
read -p "please input your name: " name
    read可以接收多個用戶輸入值,並賦值到多個變量,如果變量表在數據之前用完,則剩下的數據就會分配到最后一個變量
read -p "please input your name: " first last
echo "Hello $first.$last"
    如果在read命令行不指定變量,read命令將會把用戶輸入的數據放入特殊環境變量REPLY中。
(2)讀取超時
    read命令使用時,如果用戶沒有輸入會一直等待;使用-t選項可以指定超時時間,單位為秒。
    讀取超時后,read命令會返回一個非0的狀態退出碼。如:
read -t 5 -p "please input your name: " name
    可以使用-n選項指定讀取的字符數,read命令讀取到相應字符后會自動退出,不需回車。
(3)隱藏方式讀取
    需要讀取用戶輸入,但不希望輸入顯示在屏幕上,可以使用-s選項。
read -t 5 -s -p "please input your passwd: " passwd

二、輸入輸出重定向

(1)標准文件描述符
    linux系統將每個對象當作文件來處理,使用文件描述符來標識每個文件對象。文件描述符是一個非負數,可以唯一標識回話中打開的文件。每個過程最多可以有9個文件描述符。bash shell保留了3個文件描述符0、1和2。
        0 — STDIN     — 標准輸入
        1 — STDOUT — 標准輸出
        2 — STDERR  — 標准錯誤
    一般命令的標准輸入是鍵盤,標准輸出和標准錯誤的輸出是屏幕。
    使用 < 重定向標准輸入,使用 > 重定向標准輸出。
(2)重定向錯誤
    使用重定向時,若產生錯誤,如
ls -l badfile > test
ls: 無法訪問badfile: 沒有那個文件或目錄
    錯誤提示輸出到屏幕上,test文件被創建,但是為空。
    如果希望將錯誤提示輸出到文件中,需要在重定向符號>前加上標准錯誤的描述符2
ls -l badfile 2> test
$ cat test 
ls: 無法訪問badfile: 沒有那個文件或目錄
    如果需要將標准輸出和標准錯誤都重定向到文件,需要分開處理,如:
ls -l goodfile badfile 2> test_err 1> test
    這樣可以將錯誤提示和標准輸出重定向到不同的文件中。
    bash shell提供了特殊的重定向符&> 可以將STDERR和STDOUT的輸出重定向到同一文件中。
(3)在腳本中重定向輸出
    臨時重定型:如果需要將STDOUT的消息轉換成STDERR的輸出,可以通過在輸出的行后加 <&2
echo "this is a error message" >&2
    這樣這行命令的輸出則會顯示在STDERR文件描述符所指向的任何位置,而不再是STDOUR。
    永久重定向:可以通過exec命令告訴shell腳本執行期間重定向某個特定的文件描述符。
1 #!/bin/bash
2 #redirecting alloutput
3 exec 1>testfile
4 echo "this is a test of redirecting alloutput"
(4)在腳本中重定向輸入
    exec命令允許將STDIN重定向到文件中,如:
        exec 1< file
    這個命令告訴shell需要從file中獲取輸入,而不是STDIN。
1 #!/bin/bash
2 #redirecting file input
3 exec 0< testfile
4 count=1
5 while read line; do
6     echo "Line #$count: $line"
7     count=$[ $count + 1 ]
8 done
    當運行read命令時,不再需要用戶通過鍵盤輸入,而是直接從testfile文件中讀取數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM