在 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
扩展为空字符串。