我正在编写一个可以在命令行或交互模式下运行的实用程序。在代码中,我想检查是否设置了交互式标志,然后将问题回显给用户以阅读输入。但是,永远的问题,我不想检查交互标志与if条件。在bash脚本中,有没有更有效的方法来实现这一目标?
非常感谢任何指针!
谢谢
答案 0 :(得分:1)
这样的事可能吗?
#! /bin/bash
function interactive {
shift
while read line; do
something with $line
done
}
getopts 'i' option
[[ $option = 'i' ]] && interactive "$@"
请注意,如果您有多个选项,这不是最佳风格。在这种情况下,使用while getopts
并使用参数索引进行移位。
答案 1 :(得分:1)
如果你想知道shell是否处于“交互模式”,如shell所定义,那么你可以使用类似的东西:
case $- in
*i*) # Interactive
;;
*) # Non-interactive
;;
esac
然而,这可能不是你想要的。例如,Shell脚本默认为“非交互式”。
如果您想知道是否可以向用户询问问题,那么您更有兴趣了解stdin是否已连接到终端。在这种情况下,您可以对文件描述符零(标准输入)使用-t
测试:
if [ -t 0 ]
then
# Interactive: ask user
read -p "Enter a color: " color
read -p "Enter a number: " number
else
# Non-interactive: assign defaults
color="Red"
number=3
fi
echo "color=$color and number=$number"
如果您的脚本可能会远程运行,例如ssh
,则需要a slightly more complicated test:
if [ -t "$fd" ] || [ -p /dev/stdin ]
then
echo interactive
else
echo non-interactive
fi