暂停 Bash Shell 脚本 X 秒

Niraj Menon 2023年1月30日
  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 的参数,允许用户指定睡眠时间。