一个简单的 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 脚本,它对用户的是/否输入做出反应? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Bash 中使用布尔值编写 if/else? [复制]