我正在构建一个脚本(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将保持为空。
这有很多参数。每次都需要吗?你能默认一些吗?
基本上,我看到了三个主要的案例。
-
您有一个固定位置必需参数的列表。如果它们都是真正需要的,并且你永远不能假设其中任何一个的默认值,那么positional实际上是好的,因为它简化了你的编码。。。但一旦引入可选参数,就应该认真考虑
getopts
。 -
如果您正好有,并且只有一个可选参数,那么只需分配
arg8=$8
,就不用担心了——但一旦有了两个,那么您就真的需要考虑其含义。如果您需要$9
,但并不真正关心$8
,那么您必须传入一个伪值来填充$8
,以使成为$9
。不要去那里。 -
在大多数情况下,除非脚本真的简单(我的脚本几乎从来都不是(,否则应该使用
getopts
。
假设您正在编写一个总结使用分钟数的电信脚本。该脚本绝对需要来自用户的3个参数——例如,您需要$state
、$mmyy
和$stream
来按州、月/年、本地或远程标识输入文件。(如果你喜欢的话,你可以把它作为$STMMYYLT
或类似的东西,把它简化为一个论点,但一般来说,让一件事成为一件事。(
有了这些,你可以运行它并获得总分钟数。太棒了
但有时你需要按账户进行细分有时表示选项参数。CCD_ 17用于CCD_ 18改变累积和输出。
有时您只需要一个特定的帐户。您总是可以通过grep
或其他方式来传输结果,但如果您可以通过添加一个参数来跳过99.999%的千兆字节文件的处理,我认为这是值得的,所以让我们为--account
添加一个-a
选项。如果你给它一个账户,它会忽略其他一切。
在设计时,一定要用帮助屏幕的方式来给你提供使用说明。提前考虑这些事情会对你的设计有很大帮助。(也许这意味着--help
的-h
也是一个好主意…(
有一些关于标准格式的指导方针,比如这篇文章或这个wiki。
因此,如果您向它提供了一组不可接受的参数(包括none(,或者专门请求--help
,它应该抛出一条使用消息并退出。
这为您提供了编写代码的指南。您可以在了解更多信息时对其进行编辑。