shell脚本:检查变量然后执行交互模式

时间:2015-01-14 19:47:53

标签: bash shell flags

我正在编写一个可以在命令行或交互模式下运行的实用程序。在代码中,我想检查是否设置了交互式标志,然后将问题回显给用户以阅读输入。但是,永远的问题,我不想检查交互标志与if条件。在bash脚本中,有没有更有效的方法来实现这一目标?

非常感谢任何指针!

谢谢

2 个答案:

答案 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