如何編寫高效的 Shell 指令碼

大雄45發表於2022-10-07
導讀 如果你希望自動執行常規任務並使你的生活更輕鬆,那麼使用    是一個很好的選擇。本文將向你介紹一些基本概念,這些概念將幫助你編寫高效的 Shell  。

Shell 指令碼是一種被設計用來執行 行直譯器 UNIX Shell 的計算機程式。Shell 指令碼的各類變種被視作指令碼語言。Shell 指令碼執行的典型操作包括檔案操作、程式執行和文字列印。設定環境、執行程式並執行任何必要的清理或日誌記錄的指令碼稱為封裝。

識別 Shell  提示符

你可以透過檢視終端視窗中的提示符符號來識別   系統的計算機上的 Shell 命令提示符的使用者是普通使用者還是超級使用者。#符號用於超級使用者,$符號用於具有標準許可權的使用者。

基本命令

指令碼附帶了很多可以在終端視窗上執行的、用以管理您的計算機的命令。每個命令的詳細資訊可以在該命令附帶的使用手冊中找到。你可以使用如下命令來檢視手冊:

一些常用的命令有:

每個命令都附帶了幾個可以一起使用的選項。你可以參考使用手冊以瞭解更多的細節。 man date 的輸出如圖 1 所示。

如何編寫高效的 Shell 指令碼如何編寫高效的 Shell 指令碼

Figure 1: Manual of date command

重定向運算子

當你希望捕獲檔案中的命令輸出或重定向到檔案時,可以使用重定向運算子。

命令 描述
ls -l /usr/bin >file 預設標準輸出到檔案
ls -l /usr/bin 2>file 重定向標準錯誤到檔案
ls -l /usr/bin > ls-output 2>&1 重定向標準錯誤和標準輸出到檔案
ls -l /usr/bin &> ls-output 重定向標準錯誤和標準輸出到檔案
ls -l /usr/bin 2> /dev/null 寫入  /dev/null,丟棄輸出
大括號擴充套件

大括號擴充套件是 UNIX 提供的強大選項之一。它有助於在一行指令中使用最少的命令完成大量操作。例如:

這條命令會為 2009 到 2011 年裡的每個月建立一個目錄。

環境變數

環境變數是一個動態命名的值,它可以影響計算機上執行的程式的行為方式。此變數是程式執行環境的一部分。

命令 描述
printenv 列印出所有環境變數的值。
set 設定 Shell 選項
export 匯出環境到隨後執行的程式
alias 為命令建立別名
網路命令

網路命令對於排查網路問題和檢查連線到客戶機的特定埠非常有用。

命令 描述
ping 傳送 ICMP(網際網路控制訊息協定)資料包
traceroute 列印資料包在網路中的路徑
netstat 列印網路連線資訊、路由表、介面資料
ftp/lftp 網際網路檔案傳輸程式
wget 非互動式網路下載器
ssh OpenSSH SSH 客戶端 (遠端登入程式)
scp 安全複製
sftp 安全檔案傳輸程式
grep 命令

grep 命令用於查詢系統和日誌中的錯誤。它是 Shell 擁有的強大工具之一。

命令 描述
grep -h '.zip' file.list . 表示任意字元
grep -h '^zip' file.list 以 zip 開頭
grep -h 'zip$' file.list 以 zip 結尾
grep -h '^zip$' file.list 只含有 zip
grep -h '[^bz]zip' file.list 不含 b 和 z
grep -h '^[A-Za-z0-9]' file.list 所有檔名有效的檔案
量詞

下面是一些量詞的例子:

命令 描述
? 匹配出現 0 次或 1 次的元素
* 匹配出現 0 次或多次的元素
+ 匹配出現 1 次或多次的元素
{} 匹配出現特定次數的元素
文字處理

文字處理是當今 IT 世界中的另一項重要任務。程式設計師和管理員可以使用這些命令來切片、剪下和處理文字。

命令 描述
cat -A $FILE 顯示  $FILE 檔案的所有內容
sort file1.txt file2.txt file3.txt > final_sorted_list.txt 一次性將所有檔案排序
ls - l | sort -nr -k 5 按指定的第 5 列進行排序
sort --key=1,1 --key=2n distor.txt 對第 1 列進行排序(預設按字母表順序),對第 2 列進行數值排序
sort foo.txt | uniq -c 查詢重複的行並顯示該行重複的次數
cut -f 3 distro.txt 剪下第 3 列
cut -c 7-10 剪下 7 - 10 字元
cut -d ':' -f 1 /etc/password 分隔符  :
sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distro.txt 按第 3 列第 7 個字元、第 3 列第 1 個字元和第 3 列第 4 個字元排序
paste file1.txt file2.txt > newfile.txt 合併兩個檔案
join file1.txt file2.txt 按公共欄位連線兩個檔案
竅門和技巧

在 Linux 中,我們可以透過使用簡單的命令或控制選項返回到命令的歷史記錄。

命令 描述
clear 清空螢幕
history 檢視儲存命令的歷史記錄
script filename 捕獲檔案中的所有命令執行

一些歷史命令的技巧:

  • CTRL + R:搜尋命令歷史
  • !!number:執行編號為number 的命令
  • !! :執行上一條命令
  • !?string : 執行包含string 的上一條命令
  • !string:執行以string 開始的上一條命令
  • export HISTCONTROL=ignoredups: 忽略重複條目
  • export HISTSIZE=10000:設定儲存的歷史行數

隨著你對 Linux 命令逐漸熟悉,你將能夠編寫封裝指令碼。所有手動任務,如定期備份、清理檔案、監控系統使用情況等,都可以使用指令碼自動完成。在學習高階概念之前,本文將幫助您開始編寫指令碼。

原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2915603/,如需轉載,請註明出處,否則將追究法律責任。

相關文章