暫停 Bash Shell 指令碼 X 秒

Niraj Menon 2023年1月30日 2022年5月11日
  1. 暫停 Bash 指令碼 X 秒
  2. 暫停 Bash 指令碼一段時間
  3. 暫停 Bash 指令碼,直到發生使用者輸入
  4. 將定時暫停與使用者輸入暫停相結合
暫停 Bash Shell 指令碼 X 秒

Bash 指令碼對於執行多個命令非常有用,你可能不想在 Bash 命令 shell 中逐行輸入這些命令。在某些情況下,你可能需要暫停指令碼,可能是為了接受使用者的輸入,或者在返回命令結果之前休眠。

本教程將解釋暫停 Bash shell 指令碼的不同方法。

暫停 Bash 指令碼 X 秒

假設你從頭開始編寫指令碼,並且你決定要向潛在使用者顯示歡迎訊息,因此你必須延遲啟動指令碼以讓你的使用者可以閱讀該訊息,這將解釋你的指令碼將在之前做什麼它開始執行進一步的 Bash 命令。Bash 中的 sleep 命令可以幫助你實現這一點,詳細 here。它的語法如下:

sleep n

其中,n 是你希望它等待的秒數。n 也可以是更小的單位,例如毫秒,只需將數字指定為十進位制數 - 所以如果你想暫停 30 毫秒,sleep 0.030 應該可以解決問題!

請記住,n 是一個強制引數,因此不告訴 sleep 執行多長時間不會完全奏效。在沒有 n 值的情況下執行會產生以下錯誤。

user@linux:~$ sleep
sleep: missing operand
Try 'sleep --help' for more information.

如果你想等待的時間遠遠超過幾秒鐘,sleep 還接受指定時間單位(即分鐘、小時、天)的引數,所以如果你想等待整整一週,sleep 7d 是你的解決方案!

以下是 sleep 的一些用例。

# wait 500 milliseconds
sleep 0.5
# wait 1 second
sleep 1
# wait 20 seconds
sleep 20

要顯示一條訊息並等待 1 分鐘:

echo "Hello!  This script will run in exactly a minute!"
sleep 1m

每週重新執行指令碼以終止長時間執行的 Python 程序。

while true
do
    killall --older-than 7d python3
    sleep 7d
done

暫停 Bash 指令碼一段時間

在某些情況下,你希望等待可變的時間,可能是因為你希望根據正在執行的指令碼數量以不同的延遲執行指令碼。一個很好的例子是,如果你多次執行相同的指令碼可能需要修改同一個檔案,則每次呼叫指令碼都需要不同的延遲,以確保不會有兩個呼叫同時修改檔案。

在這種情況下,你可以將 n 設為實際的 Bash 樣式變數 $N,並在指令碼中的某個位置設定它的值。一個例子如下:

N=5
sleep $N

放置此指令碼的指令碼應休眠 5 秒。

如果你省略 $N 的初始化,而是在呼叫指令碼時指定值,你可以使用在 shell 環境中定義的 N 的值來為指令碼提供 sleep 時間段.

user@linux:~$ cat test.sh
#! /bin/bash
sleep $N
user@linux:~$ export N=3
user@linux:~$ chmod +x test.sh
user@linux:~$ ./test.sh

結果,你應該會看到指令碼執行了 3 秒。你甚至可以覆蓋環境值並通過執行 N=2 ./test.sh 在指令碼呼叫中指定它。

你甚至可以考慮通過使用 $RANDOM 作為 sleep 的引數來隨機化延遲量 - 因此,你可以說 sleep $RANDOM

如果 $RANDOM 中的值範圍對你來說太大,應用帶有可選附加值的模運算以確保最小延遲應該允許你休眠幾秒鐘。例如,要睡眠一段時間,介於 10 到 30 秒之間,你可以執行以下操作:

sleep $((10 + RANDOM % 21))

暫停 Bash 指令碼,直到發生使用者輸入

有時,等待特定的時間不會減少它 - 你可能希望確保使用者已閱讀你的歡迎訊息和/或準備好開始執行你的指令碼。在這種情況下,你希望等待他們輸入一些內容以表明他們已準備好開始。

為此,我們將使用 read 命令,詳細說明 hereread 將等待在標準輸入中輸入資料 - 你鍵入命令的命令列可以稱為標準輸入 - 最後的 Enter 鍵擊向命令發出資料已輸入的訊號。然後可以將字串放入變數中或簡單地忽略,這是我們將在此處考慮的用例。

read 的最簡單呼叫不需要引數:

read 

它應該會導致列印一個新行,你可以在其中輸入一些內容。無論你之前輸入了什麼,按 Enter 應該會返回到 Bash 提示符。

將定時暫停與使用者輸入暫停相結合

需要你將定時暫停與使用者輸入暫停結合起來的一個極好的用例是確保你希望指令碼在使用者沒有響應的情況下繼續執行,而他們這樣做並不重要。read 命令允許我們通過指定 -t 引數來執行此操作,如果未按下 Enter<> 鍵,該命令將在超時之前等待幾秒鐘。它將按如下方式使用。

read -t 5

因此,當按下 Enter 鍵或經過 5 秒(以先到者為準)時,read 將退出。

另一個用例是等待使用者自己指定的指定時間。在這種情況下,你可以等待使用者輸入一個整數值,然後將其作為引數傳遞給 sleep,如下所示。

echo -n "Enter time to sleep: "
read $time
sleep $time

當然,這是假設使用者會為 sleep 輸入一個有效引數。

讓我們用一些例子來回顧一下!

  • sleep 3 將暫停指令碼正好 3 秒。
  • sleep 3d 將暫停指令碼整整 3 天。
  • sleep $N 將暫停指令碼指定為 $N 的秒數。
  • sleep $((10 + RANDOM % 21)) 將在 10-30 秒內隨機休眠一段時間。
  • read 等待使用者輸入內容。
  • read -t 3 等待使用者輸入內容,但如果從未按下 Enter 鍵,則會在 3 秒後超時。
  • read $time && sleep $time 將從使用者那裡獲取一個字串引數並將其用作 sleep 的引數,允許使用者指定睡眠時間。