shell 腳本編程學習(五) 輸入輸出重定向和環境變量

輸入輸出重定向

輸入輸出重定向在 shell 中經常使用,例如把一個命令的輸出保存到文件或者通過管道將命令組合起來使用等,shell 腳本允許我們用 shell 實現更復雜的邏輯,所以有必要熟練掌握輸入輸出重定向機制。
我們知道在 linux 系統中“一切皆是文件”,而每次打開一個 shell 的時候,linux 都會打開 3 個文件供程序使用:

  • STDIN(標準輸入)——通常是終端鍵盤
  • STDOUT(標準輸出)——通常是終端顯示器
  • STDERR(標準錯誤輸出)——通常也是終端顯示器

默認情況下程序從鍵盤獲得輸入再把結果和錯誤打印到屏幕上,但這不是程序工作的唯一方式,我們可以使用重定向操作符指定其它的輸入和輸出文件讓程序使用。

# > 操作符將 STDOUT 重定向到一個文件
ls > out.txt 

# >> 操作符將 STDOUT 添加到一個文件的末尾
ls >> out.txt 

# < 操作符將 STDIN 重定向到一個文件
grep '\.txt' < in.txt 

# | 管道操作符,從一個程序或進程獲得輸出,然後作爲輸入發送給另一個程序或進程
ls | wc -l 

# << delimiter 把當前的輸入流和 STDIN 關聯起來直到到達指定的分隔符(delimiter)
# php 中也有這樣的語法,當需要指定大量多行的文本輸入時很有用
cat <<END
hello world!
line2
line3
END

由於 linux “一切皆是文件”的設計,通過重定向輸入輸出文件,我們可以讓我們的程序從普通文件、管道文件、網絡套接字、硬件設備等任何地方獲得輸入,也可以將程序結果輸出到任何地方,這樣就大大提高了程序的靈活性。最後還要注意輸出重定向操作符的幾個修飾標記,實踐中經常會用到。

# 將輸出發送給空設備,這麼做可以實現捨棄程序輸出的效果。
# 計劃任務中那些需要反覆執行又不想輸出其結果的操作可以這樣重定向。
sh script.sh > /dev/null 

# 將 STDERR 重定向到一個文件。
# 前面一直在說 STDIN 和 STDOUT 的重定向,其實想重定向 STDERR 只要在 > 操作符前加個 2 修飾就行了。
sh script.sh 2> error.txt 

# 在 > 操作符前加 & 修飾表示把 STDIN 和 STDOUT 都重定向到一個文件。
sh script.sh &> /dev/null 

# 這是另一種寫法,即將 STDIN 重定向到一個文件,再將 STDERR 重定向到 STDIN,和上面的寫法效果相同。
sh script.sh > /dev/null 2>&1 

# 也可以將 STDIN 和 STDOUT 重定向到不同的文件。
sh script.sh >out.txt 2>error.txt 

環境變量

在 shell 中直接設置的變量是隻在當前 shell 中有效的。有時候我們會想讓一些變量在子 shell 中也能使用的,例如想要傳遞變量給 shell 腳本的時候,這時應該使用 export 命令將變量導出,這種在子 shell 中也有效的變量也叫做環境變量。

# 導出 name 變量,以後在子 shell 中讀取 name 變量也會得到數據 123
name=123
export name=123

# 設置並導出 PATH 環境變量讓讓它多包含一個目錄
export PATH=$path:/home/my/shell 

環境變量的原理很簡單,可以理解爲當前 shell 會記錄下用 export 導出的變量,當從當前 shell 開啓子 shell 時(例如運行一段 shell 腳本)會爲子 shell 預先設置好導出的變量。由此我們也知道 shell 導出的變量只對它的子 shell 有效 。

# export 測試1 導出變量對子 shell 有效
# test1.sh
echo $name1

# main shell
name1=jack
export name1
sh test1.sh 
# 輸出 jack


# export 測試2 導出變量對父 shell 無效
# test2.sh
name2=jack
export name2

# main shell
sh test2.sh
echo $name2 
# 輸出爲空,即 name2 變量沒有被設置

另外想查看當前 shell 中已經設置的變量,使用 set 命令。想刪除一個變量可以用 unset 命令。

# 列出當前 shell 中所有已經設置的變量
set 

# 從當前 shell 中刪除 name 變量
unset name 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章