bash脚本中灵活的参数数量

时间:2015-02-27 12:15:20

标签: bash shell variables parameters

我正在使用以下类型的bash代码。我在日志文件中存储了一些信息,其名称在bash脚本中定义。

LOGNAME="/tmp/ETH"
LOG_FILE="${LOGNAME}.log"    

function exit_error()
{
    case "$1" in
        100 )
            echo "Bad arguments supplied - Enter help"
            echo "Bad arguments supplied - Enter help" >> "${LOG_FILE}"
            ;;      
        101 )
            echo "Illegal number of parameters"
            echo "Illegal number of parameters" >> "${LOG_FILE}"
            ;;       
        * )
            ;;
    esac    
    exit 1;
}

function current_status()
{
    INT_STATUS=$(cat /sys/class/net/eth1/operstate)
    echo "status : $INT_STATUS"
    echo "status : $INT_STATUS" >> "${LOG_FILE}"
}

function connect_eth()
{
    ...
}

...

case "$1" in
    current_status )
        if [ "$#" -ne 1 ]
        then
            exit_error 101
        else
            current_status
        fi
        ;;  
    connect_eth )
        if [ "$#" -ne 1 ]
        then
            exit_error 101
        else
            connect_eth
        fi
        ;;
    read_MAC_addr )
        if [ "$#" -ne 1 ]
        then
            exit_error 101
        else
            read_MAC_addr 
        fi      
        ;;  
    read_IP_addr )
        if [ "$#" -ne 1 ]
        then
            exit_error 101
        else
            read_IP_addr
        fi
        ;;
    * )
        exit_error 100
        ;;
esac
exit 0; 

如果没有将其他日志名称指定为最后一个参数,我想修改脚本以使用指定的日志名称。但是,我想保留我的" exit_error 101"在switch case中,它基于传递给脚本的参数数量。有没有办法做到这一点 ?因为我无法修改$#变量。

1 个答案:

答案 0 :(得分:2)

应该可以。做这样的事情:

CMD="$1"
shift
# use provided logname or set to default if not found
LOGNAME="${1:-/tmp/ETH}
shift
LOGFILE="${LOGNAME}.log"
# now, since we shifted, you just have to check for $# -eq 0 to
# be sure there are no params left.

... your function definitions here ...

# exit 101 if there are some parameters left
if [ $# -ne 0 ]; then
  exit_error 101
fi

case "$CMD" in
  current_status)
    current_status
    ;;
  ...
  *)
    exit_error 100
    ;;
esac

如果您想要更多灵活性,可以始终使用getopts和命名参数。它通常更容易维护。

而且,如果我是你,我还会在案件陈述之前集中错误处理,以便在任何地方重复检查。