【问题标题】:A simple if/else bash script which reacts to user's yes/no input? [duplicate]一个简单的 if/else bash 脚本,它对用户的是/否输入做出反应? [复制]
【发布时间】: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 我正在启动一些外部开发工具,如果没有 & 该工具将只启动第一个命令

标签: bash shell


【解决方案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 [[$; 之间的空格很重要,我发现,..
猜你喜欢
  • 1970-01-01
  • 2020-11-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 2021-08-10
  • 2013-09-10
相关资源
最近更新 更多