将可变数量的参数传递给外壳脚本

guykilcj  于 2022-10-23  发布在  Linux
关注(0)|答案(4)|浏览(123)

我正在构建一个脚本(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个参数。我怎么能这样做呢?

k10s72fa

k10s72fa1#

您可以这样做:

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

另外,如果你这样做了

arg8=$8

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

fcg9iug3

fcg9iug32#

另一个想法。指定前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
qfe3c7zg

qfe3c7zg3#

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


# !/usr/bin/env bash

if (($# == 8)); then
  printf '%d arguments given\n' "$#"
elif (($# > 8)); then
  printf '%d is greater than 8\n'  "$#"
elif (($# < 8)); then
  printf '%d is  Less than 8\n' "$#"
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
q8l4jmvw

q8l4jmvw4#

这是一大堆的争论。它们每次都是必要的吗?你能违约一些吗?
基本上,我认为这有三个主要案例。
1.您有一个固定位置必需参数的列表。如果它们都是真正需要的,并且您永远不能为它们中的任何一个假定缺省值,那么位置实际上是“好的”,因为它简化了您的编码……但是,一旦引入了可选参数,您就应该认真开始考虑getopts
1.如果您有恰好且只有一个可选参数,那么只需指定arg8=$8并不需要担心--但是一旦您有两个,那么您真的需要考虑其影响。如果您需要$9,但实际上并不关心$8,那么您必须传入一个伪值来填充$8,这样才会有一个$9。别去那里。
1.在大多数情况下,除非脚本非常简单(而我的脚本几乎从来都不是),否则您应该使用getopts
假设您正在编写一个电信脚本,该脚本汇总了几分钟的使用量。该脚本绝对需要来自用户的3个参数--对于我们的示例,假设您需要$state$mmyy$stream来按州和月/年以及本地或远程标识输入文件。(您总是可以将其作为$STMMYYLT或类似的东西传递,以将其简化为一个参数,如果这是您的口味,但通常情况下,让一件事成为一件事。)
有了这些,你就可以运行它并获得总分钟数。太棒了。
但有时你需要将它们按账户分类。有时表示选项参数。--summarize-s更改积累和输出。
有时,您只需要一个特定的帐户。您总是可以通过grep或其他函数来传递结果,但是如果您可以通过再添加一个参数来“跳过”处理99.999个大小为99.999的多GB文件,我认为这是值得的,所以让我们为--account选项添加一个-a选项。如果您给它一个帐户,它将忽略其他所有内容。
在设计时,总是按照帮助屏幕上给你的使用说明来做事情。提前考虑这些事情真的会对你的设计有帮助。(也许这意味着-h代替--help也是个好主意……)
有一些关于标准格式的指导原则,如this postthis wiki
因此,如果您向它提供了一组不可接受的参数(包括无参数),或者明确请求--help,它应该发出一条用法消息并退出。
这将为您提供编写代码的指南。当你想出更多的时候,你可以编辑它。

相关问题