Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash脚本中的参数数量灵活_Bash_Shell_Variables_Parameters - Fatal编程技术网

bash脚本中的参数数量灵活

bash脚本中的参数数量灵活,bash,shell,variables,parameters,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 -

我正在使用下面的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”保留在基于传递给脚本的参数数量的开关情况下。有办法吗?因为我不能修改$#变量

这应该是可能的。这样做:

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
如果需要更大的灵活性,可以始终使用和命名参数。它通常更容易维护


而且,如果我是你,我也会在案例陈述之前集中错误处理,以避免在任何地方重复相同的检查。

我已经尝试过你的解决方案,每次都会通过exit\u error 100。。因为在轮班后$1等于零,我完成了样本。显然$1将为空,在非错误情况下$#等于零。这就是重点。因此,您必须使用$CMD.Thank tgo它可以工作!但是你的解决方案只有在函数有一个参数时才有效,不是吗?如果我有一个接受可变参数的n函数,我必须根据每个可能性,在脚本之上使用一个a开关,否则有一个非常简单有效的解决方案?@SnP欢迎您。是的,这样事情确实会变得非常复杂。这就是为什么我要引用
getopts
。如果使用
getopts
,事情变得太复杂,可能意味着您需要多个脚本/命令。