一个简单的 if/else bash 脚本,它对用户的是/否输入做出反应? [复制]

Posted

技术标签:

【中文标题】一个简单的 if/else bash 脚本,它对用户的是/否输入做出反应? [复制]【英文标题】:A simple if/else bash script which reacts to user's yes/no input? [duplicate] 【发布时间】:2012-07-07 14:11:28 【问题描述】:

我基本上有一个连续执行 5 个命令的 bash 脚本。我想添加一个逻辑,询问我“你想执行命令 A”,如果我说是,则执行命令,否则脚本跳转到另一行,我看到提示“你想执行命令 B” .

脚本很简单,长这样

echo "Running A"
commandA &
sleep 2s;
echo "done!"

echo "Running B"
commandB &
sleep 2s;
echo "done!"
...

【问题讨论】:

你为什么要使用& 并在那里睡觉?你应该同步运行它... @cha0site 我正在启动一些外部开发工具,如果没有 & 该工具将只启动第一个命令 【参考方案1】:

你想要 Bash read builtin。您可以使用隐式 REPLY 变量在循环中执行此操作,如下所示:

for cmd in "echo A" "echo B"; do
    read -p "Run command $cmd? "
    if [[ $REPLY,, =~ ^y ]]; then
        eval "$cmd"
        echo "Done!"
    fi
done

这将遍历您的所有命令,提示用户输入每个命令,然后仅当用户响应的第一个字母是 Y 或 y 字符时才执行命令。希望对您有所帮助!

【讨论】:

如果可以,您可能想尽量避免使用eval。一个想法是将每个命令封装在一个函数中,该函数要么描述自己,要么根据你调用它的方式运行自己。 小写参数扩展$,,需要Bash 4。参见BashFAQ/050。【参考方案2】:

使用read 内置函数从用户那里获取输入。

read -p "Run command $foo? [yn]" answer
if [[ $answer = y ]] ; then
  # run the command
fi

如果您要多次执行此操作,请将上述内容放入 function 以将命令(可能还有提示符)作为参数。

【讨论】:

我不能使用双 [[ 括号,但可以使用单 [ 括号。 它确实应该与[[ 一起使用。你确定你使用bash#! /bin/bash作为你脚本的第一行吗? 第一行没有#! /bin/bash。我想这可能是问题所在,因为我没有明确表示它是 bash。 @sandalone [[$; 之间的空格很重要,我发现,..

以上是关于一个简单的 if/else bash 脚本,它对用户的是/否输入做出反应? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

[linux shell]if -else 例子

如何在 Bash 中使用布尔值编写 if/else? [复制]

PIG 脚本 IF ELSE 语句

shell if else if

jenkins 管道脚本中 docker 容器的 if else 条件

Powershell Try/Catch 或 If/Else 不适用于我的脚本