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

任何指针,不胜感激!

谢谢

#1楼 票数:1

像这样的东西?

#! /bin/bash

function interactive {
    shift
    while read line; do
        something with $line
    done
}

getopts 'i' option
[[ $option = 'i' ]] && interactive "$@"

请注意,如果您有多个选择,则这不是最佳样式。 在这种情况下,使用while getopts并使用参数索引进行平移。

#2楼 票数:1

如果要告诉外壳程序是否处于外壳程序定义的“交互模式”下,则可以使用类似以下内容的方法:

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 ,则需要稍微复杂一些的测试

if [ -t "$fd" ] || [ -p /dev/stdin ]
then
    echo interactive
else
    echo non-interactive
fi

  ask by ray translate from so

未解决问题?本站智能推荐:

1回复

想在脚本中创建多个标志?

我想为我的脚本制作多个标志。 并没有像我想要的那样工作。 我希望它像这样工作: 请输入要复制的源文件:File1 file2 file3 请输入目的地:dir1 复制成功。 按任意键返回主菜单。
1回复

在文件中传递的Bash脚本[关闭]

我有main.sh,它里面调用sub.sh。 但是,我需要将信息传递给sub.sh。 可以这样做吗?
1回复

使用getopt的Bash脚本-长选项

到目前为止,我已经编辑了脚本,但无法正常运行。 首先,我将介绍以下代码: 正如您在我用cli编写时所看到的: 它不起作用,但是当我将代码更改为: 然后就可以了! 我的问题是如何与我的职能联系起来? 我介绍以下两个功能。
1回复

防止在运行脚本时同时使用两个标志

我的script.sh用法: 选项: 我想在-1和-2标志之间进行互斥,以便如果指定-1,则不能使用-2并抛出错误,反之亦然可以使用getopts来实现吗?
2回复

Shell脚本-x标志的含义

我有一个#!/ bin / sh脚本,其中包含以下行: $TEST_SLAPD是.bat文件的完整路径。 我想知道-x标志在该if语句的上下文中意味着什么?
2回复

脚本与简单的标志

假设我有这个简单的脚本 那么在我的脚本中添加“标志”检查的最简单方法是什么? 谢谢
2回复

如何检查tcsh中是否存在单个标志?

我有一个bash脚本,它带有命令行标志“ --signal”。 在命令行上指定该选项后,我想在命令提示符下运行一行。 是否有一种简短的if语句进行检查的简洁方法? Getops比我不太喜欢的东西更加混乱。
1回复

在bash脚本中将标志传递给程序

背景 我有一个程序prog ,它从stdin接收输入并对其进行处理。 它还需要一个标志-f FILE来查找操作期间使用的数据文件。 我希望创建一个bash脚本来充当该程序的包装,这样就不必使用此标志。 所以我写了以下脚本progwrap.sh : 它可以完成基本功能,因此我可以做