如何检测输入是否来自参数、文件或终端

如何检测输入是否来自参数、文件或终端

在 bash 中,有没有办法知道给定的脚本是否已被调用:

$ myscript.sh myfile

或者:

$ myscript.sh < myfile

myfile在一些脚本中,我总是访问with的内容$1,但现在我想根据不同的情况更改行为。

编辑:我还想要在没有任何重定向的情况下调用时的第三种情况:

$ myscript.sh

答案1

编辑:更改-t-t 0,它可以正确检测来自终端或文件的输入。

我认为这里的关键是知道您的输入是来自终端还是来自文件。有一个针对此的测试(man test参见-t)。

假设您正在运行 bash 脚本:

if [ -t 0 ]; then
    echo "Input from terminal"
    if [ $# -eq 0 ]; then
        echo "No input files specified on command line.  Error." >&2
    else
        echo "Input file given on command line.  It is $1"
    fi
else
    echo "Input coming from stdin"
fi

您可以通过用实际代码替换上面的 echo 语句来处理不同的场景。

更新,快速测试脚本:

#!/bin/bash
[ -t 0 ] && echo "t is true" || echo "t is false"

跑步:

$ test.sh testfile
t is true
$ test.sh < testfile
t is false
$

答案2

一般来说,表达式$1$2等会扩展为脚本命令行上给出的第一个、第二个等参数。

因此,当您调用脚本时:

myscript.sh myfile

然后$1在脚本中扩展为myfile(和$2$3等都是空字符串)。

当您调用脚本时:

myscript < myfile

STDIN 的重定向myfile是由父 shell 完成的,因此该脚本实际上是用参数并$1扩展为空字符串。

相关内容