我正在编写一个用于各种目的的 shell 脚本。各种操作取决于输入参数。如何检查 shell 脚本运行时传递了哪些参数?
有人可以解释一下这个查询是如何工作的吗?假设我有 1 个 shell 脚本abc.sh
,它需要 1 个输入参数,并且根据其值,shell 脚本应该或不应该执行某些操作。假设我已将“1”作为输入参数传递并安排了运行。当 shell 脚本运行时,如何测试参数的值?
答案1
_fn() { set -- "$@" $(cat)
while ${1+:} false ; do
echo "$1" && [ "$1" = "arg2" ] && echo "$1"
$YOUR_CHK
shift
done
}
echo "arg2" | _fn "arg1"
输出
arg1
arg2
arg2
它可以处理 cmd 行参数和stdin
.它仅while
在参数数组中至少保存一个参数时运行循环来检查它们。它确实会丢弃它检查的每个参数,因此其中一部分$YOUR_CHK
应该是以某种方式保存您认为有价值的信息。
_fn
如果其内容是脚本主体,或者是 shell 函数的形式,则其行为会相同。
_fn
处理stdin
- 在这种情况下,通过将其位置参数 shell数组设置为在命令行上传递的所有内容来"arg2" echo
覆盖|pipe
第一行中的- 或- 并且所有内容都通过 吐出。set
$@
"$@"
cat
$(command substitution)
while _fn's $1
第一个参数是${set+}
我们替换 shell 的内置函数:true
以满足while
循环条件。一旦$1
未设置替换失败,条件就会计算为false
并且while
循环中断。
while
对于循环的每次迭代,如果成功,则_fn() echo
es 的$1
第一个参数&&
(echo
是总是success)[ tests ]
来查看是否$1
等于字符串,"arg2"
&&
如果es再次[ test ]
成功。_fn() echo
$1
$YOUR_CHK
是一个空操作 - 它是一个未设置的变量,在 shell 执行任何代码之前其计算结果为空。
对于循环的每次迭代,while
我们shift
都会去掉$1
第一个参数。所以在迭代 1 中"$@"
看起来像:
arg1 arg2
但在我们shift
第一次之后,它看起来像:
arg2
在我们shift
上次之后,它看起来像:
因此,这让我们再次回到${1+:} false
- 因为$1
现在未设置,外壳将不会替换:true
,而只会false
被评估,这会打破while
循环并结束_fn().