跳轉到內容

Bash Shell 指令碼/入門練習

來自華夏公益教科書,自由的教科書

我們將看幾個例子,以瞭解 Bash 指令碼可以用於什麼。如果您現在還不理解,請不要擔心。

Hello World

[編輯 | 編輯原始碼]

讓我們從一個簡單的 "hello world" 程式開始

echo 'Hello, world!'

我們可以直接在 Bash 提示符中鍵入它,或者將其另存為檔案(例如,hello_world.sh)並透過在 Bash 提示符中鍵入 bash hello_world.sh./hello_world.sh 來執行它。(稍後我們將看到一些更復雜的方法來建立和執行 Bash 指令碼檔案。)無論哪種情況,它都會列印 Hello, world!

$ echo 'Hello, world!'
Hello, world!

在這裡我們使用 $ 符號來表示 Bash 提示符:在 $ 之後,該行的其餘部分顯示我們鍵入的命令,下一行顯示該命令的輸出。

檢查檔案

[編輯 | 編輯原始碼]

這是一個稍微複雜一點的指令碼

if [[ -e readme.txt ]] ; then
  echo 'The file "readme.txt" exists.'
else
  echo 'The file "readme.txt" does not exist.'
fi

這個指令碼測試當前目錄中是否存在名為 readme.txt 的檔案,並使用 if 語句根據該測試來控制執行哪些命令。它也可以直接在提示符中鍵入——任何指令碼都可以——但在這種情況下,這可能沒有用。

以上兩個完全都在 "Bash 內部",因為它們不需要 Bash 執行任何外部程式。(命令 echoif … then … else … fi[[ -e … ]] 都是內建命令,由 Bash 本身實現。)但是,作為一種 shell 指令碼語言,Bash 的一大目的就是執行外部程式。以下指令碼演示了這種能力

if [[ -e config.txt ]] ; then
  echo 'The file "config.txt" already exists. Comparing with default . . .'
  diff -u config-default.txt config.txt > config-diff.txt
  echo 'A diff has been written to "config-diff.txt".'
else
  echo 'The file "config.txt" does not exist. Copying default . . .'
  cp config-default.txt config.txt
  echo '. . . done.'
fi

這裡 diffcp 是兩個常見的實用程式,雖然不是 Bash 的一部分,但在大多數擁有 Bash 的系統上都能找到。上面的指令碼假設存在一個名為 config-default.txt 的預設配置檔案,並檢查是否存在名為 config.txt 的配置檔案。如果 config.txt 存在,則指令碼使用外部程式 diff 來生成一個 "diff"(關於兩個檔案之間差異的報告,在本例中是兩個檔案),以便使用者可以看到哪些非預設配置已到位。如果 config.txt 不存在,則指令碼使用外部程式 cp ("copy") 將預設配置檔案複製到 config.txt

如您所見,外部程式使用與內建命令相同的語法執行;它們都是 "命令"。

上面的指令碼版本非常 "冗長",因為它產生了大量的輸出。更典型的指令碼可能不會包含 echo 命令,因為使用者不太可能需要這種級別的資訊。在這種情況下,我們可以使用 # 符號來包含對 Bash 完全忽略的註釋,並且不會顯示給使用者。這些註釋只是為了閱讀指令碼本身的人提供的資訊。

if [[ -e config.txt ]] ; then
  # if config.txt exists:
  diff -u config-default.txt config.txt > config-diff.txt # see what's changed
else
  # if config.txt does not exist:
  cp config-default.txt config.txt # take the default
fi

但這只是為了演示的目的。在現實中,像這樣簡單的指令碼根本不需要任何註釋。

華夏公益教科書