linux 记录shell脚本的参数

ctrmrzij  于 12个月前  发布在  Linux
关注(0)|答案(7)|浏览(94)

是否有一个记录shell脚本参数的约定?
举例来说:

#!/usr/bin/env bash

# <description>
#
# Usage:
#  $ ./myScript param1 [param2]
# * param1: <description>
# * param2: <description>

我不喜欢这个特定模板的一些事情:

  • 脚本的文件名(myScript)出现在文件本身中
  • 参数描述似乎很奇怪
  • $之前的前导空格在视觉上是有用的,但可能会导致语言与块注解的混淆,导致一些验证工具抱怨混合/不一致的缩进(例如,空格,制表符用于代码-当然,前提是你更喜欢制表符)

在这方面是否有任何准则?

r6l8ljro

r6l8ljro1#

传统上,你在usage()函数中记录你的参数:

#!/bin/bash

programname=$0

function usage {
    echo "usage: $programname [-abch] [-f infile] [-o outfile]"
    echo "  -a      turn on feature a"
    echo "  -b      turn on feature b"
    echo "  -c      turn on feature c"
    echo "  -h      display help"
    echo "  -f infile   specify input file infile"
    echo "  -o outfile  specify output file outfile"
    exit 1
}

usage
093gszye

093gszye2#

我通常把我的用法 Package 在函数中,这样我就可以从-h参数调用它。

#!/bin/bash
usage() {
    cat <<EOM
    Usage:
    $(basename $0) Explain options here

EOM
    exit 0
}

[ -z $1 ] && { usage; }
jc3wubiy

jc3wubiy3#

我会使用Heredoc重新评论:

usage () {
    cat <<HELP_USAGE

    $0  [-a] -f <file>

   -a  All the instances.
   -f  File to write all the log lines
HELP_USAGE
}

而不是:

echo "$0  [-a] -f <file>"
echo
echo "-a  All the instances."
echo "-f  File to write all the log lines."

我认为它比所有这些回声线都要干净。

ecr0jaav

ecr0jaav4#

Vim bash IDE可以做到这一点:

#!/bin/bash
#===============================================================================
#
#          FILE:  test.sh
#
#         USAGE:  ./test.sh
#
#   DESCRIPTION:
#
#       OPTIONS:  ---
#  REQUIREMENTS:  ---
#          BUGS:  ---
#         NOTES:  ---
#        AUTHOR:  Joe Brockmeier, [email protected]
#       COMPANY:  Dissociated Press
#       VERSION:  1.0
#       CREATED:  05/25/2007 10:31:01 PM MDT
#      REVISION:  ---
#===============================================================================
uemypmqf

uemypmqf5#

我建议让你的脚本自动打印用法(如果它不应该在没有参数的情况下运行):

#!/usr/bin/env bash

if [ $# == 0 ]; then
    echo "Usage: $0 param1 [param2]"
    echo "* param1: <description>"
    echo "* param2: <description>"
fi
8cdiaqws

8cdiaqws6#

我宁愿写:

Usage: `basename $0` [option1]|[option2] param1
  Options:
   - option1:  .....
   - option2:  .....
  Parameters:
   - param1:   .....

尝试查看标准UNIX实用程序(例如ls --help)的帮助格式

x4shl7ld

x4shl7ld7#

基于@eddy的excellent answer,下面是处理多个参数的版本(在本例中为2)

#!/bin/bash

usage() {
    cat <<EOM
Usage: $(basename $0) <username> <myproject> 
where 
  <username> is your user name
  <myproject> is your project's name
EOM
    exit 1
}

[ $# != 2 ] && { usage; }
for arg in "$@"
do
    [ -z "$arg" ] && { usage; }
done

需要仔细检查参数数组的长度([ $# != 2 ])以及参数是否为null([ -z "$arg" ]),以处理作为参数给出的空字符串。

相关问题