在运行之前检查 shell 脚本是否采用命令行参数

在运行之前检查 shell 脚本是否采用命令行参数

让我们看下面的代码:

#!/bin/bash
arg=$1
echo $arg

如果我用参数运行它,它会打印参数;如果不是,它什么也不做。我想知道的是,是否可以在运行之前或不运行之前查明它是否需要命令行参数?

答案1

sh- 在命令行上使用参数的兼容 shell 脚本通常包含$1、等或$2或或其组合。然而,这既不是必要的,也不是充分的!$3$@$*

这将 grep 脚本并返回包含这些类型字符串的所有行:

grep '\$[1-9@*]' script.sh

您可能会从不采用命令行参数但包含采用参数的函数的脚本或仅在未计算的字符串中包含这些字符的脚本中得到误报。如果脚本包含对awk例如的调用,那么这些也可能包含$1不引用脚本本身的命令行参数的等。

getopt您还可以在脚本中查找该字符串,以查看脚本是否使用命令行getoptgetopts对命令行进行正确的解析。

捕获可能使用命令行参数的情况隐含地有点难。例如,使用for variablename; do ... done或 时会发生这种情况select variablename; do ... done。但是,如果脚本已用于set显式填充位置参数,则这不会触及任何命令行参数。可能需要对脚本进行目视检查才能解决这个问题。

在“现实生活”中,人们会阅读随附的文档。如果由于某种奇怪的原因而无法使用,请阅读代码。

答案2

你不能。这个问题通常是不可判定的——无论你发明什么算法,人们都可以想出一个它会失败的例子。为了满足您的胃口,请考虑以下脚本 - 它们是否会争论?

# script 1
false && echo catch $1 if you can

# script 2
x='$'
y=1
eval echo $x$y

答案3

要求没有意义。程序接收命令行参数列表并选择它的用途。 shell 脚本或任何其他程序可以根据需要接受任意数量的命令行参数。

您可以将“采用命令行参数”定义为“使用 0 个参数调用时不会执行任何有用的操作”。但接下来你需要定义“有用”。您提供的示例脚本在不带参数调用时会执行某些操作:它会打印一个空行。为什么你将打印空行定义为无用?

另一种可能的定义是,如果程序在传递至少一个命令行参数时的行为与传递 0 时的行为不同,则“采用命令行参数”。这对我来说是最自然的定义,但显然这不是您正在使用的定义因为您的示例脚本确实使用其第一个参数来确定要输出的内容。

你需要重新思考你的问题。 “接受命令行参数”是什么意思?一旦你定义了你的问题,你就会更接近解决方案。

相关内容