向shell脚本传递可变数量的参数



我正在构建一个脚本(linux bash(,其中我需要传递一定数量的参数,可以是7或8个参数。

如果我通过7个论点,我会这样做:

my_script.sh

!/bin/bash
arg1=$1
arg2=$2
arg3=$3
arg4=$4
arg5=$5
arg6=$6
arg7=$7
#Do other stuff after this

我这样运行它:./my_script.sh 1 2 3 4 5 6 7

我希望能够在这个脚本中添加一个可选的第8个参数。因此,我们的想法是有时使用第8个参数运行脚本,其余时间仅使用7个参数。我该怎么做?

另一个想法。指定前7个参数后,使用shift 7将它们从位置参数中清除。然后,任何额外的参数都在"$@"中,数字在$#

arg1=$1
arg2=$2
arg3=$3
arg4=$4
arg5=$5
arg6=$6
arg7=$7
shift 7
echo "There are $# extra parameters"
for arg in "$@"; do
echo "-> $arg"
done

您可以检查$#的值,类似于。

#!/usr/bin/env bash
if (($# == 8)); then
printf '%d arguments givenn' "$#"
elif (($# > 8)); then
printf '%d is greater than 8n'  "$#"
elif (($# < 8)); then
printf '%d is  Less than 8n' "$#"
fi

测试该脚本。

my_script {1..8}

输出

8 arguments given
my_script {1..87}

输出

87 is greater than 8

my_script {1..7}

输出

7 is  Less than 8

您可以这样做:

if [[ $8 != '' ]]
then
# do something
fi

此外,如果你做

arg8=$8

如果没有第八个arg,arg8将保持为空。

这有很多参数。每次都需要吗?你能默认一些吗?

基本上,我看到了三个主要的案例。

  1. 您有一个固定位置必需参数的列表。如果它们都是真正需要的,并且你永远不能假设其中任何一个的默认值,那么positional实际上是好的,因为它简化了你的编码。。。但一旦引入可选参数,就应该认真考虑getopts

  2. 如果您正好有,并且只有一个可选参数,那么只需分配arg8=$8,就不用担心了——但一旦有了两个,那么您就真的需要考虑其含义。如果您需要$9,但并不真正关心$8,那么您必须传入一个伪值来填充$8,以使成为$9。不要去那里。

  3. 在大多数情况下,除非脚本真的简单(我的脚本几乎从来都不是(,否则应该使用getopts

假设您正在编写一个总结使用分钟数的电信脚本。该脚本绝对需要来自用户的3个参数——例如,您需要$state$mmyy$stream来按州、月/年、本地或远程标识输入文件。(如果你喜欢的话,你可以把它作为$STMMYYLT或类似的东西,把它简化为一个论点,但一般来说,让一件事成为一件事。(

有了这些,你可以运行它并获得总分钟数。太棒了

但有时你需要按账户进行细分有时表示选项参数。CCD_ 17用于CCD_ 18改变累积和输出。

有时您需要一个特定的帐户。您总是可以通过grep或其他方式来传输结果,但如果您可以通过添加一个参数来跳过99.999%的千兆字节文件的处理,我认为这是值得的,所以让我们为--account添加一个-a选项。如果你给它一个账户,它会忽略其他一切。

在设计时,一定要用帮助屏幕的方式来给你提供使用说明。提前考虑这些事情会对你的设计有很大帮助。(也许这意味着--help-h也是一个好主意…(
有一些关于标准格式的指导方针,比如这篇文章或这个wiki。

因此,如果您向它提供了一组不可接受的参数(包括none(,或者专门请求--help,它应该抛出一条使用消息并退出。

这为您提供了编写代码的指南。您可以在了解更多信息时对其进行编辑。

相关内容

  • 没有找到相关文章

最新更新