bash输入参数值设置为0而不是传递给

时间:2015-11-20 20:03:33

标签: bash

使用以下代码,DBUSER变量始终设置为0,而不是从命令行传递的值。

我无法弄清楚我做错了什么导致DBUSER被设置为0而不是命令行输入参数提供的实际值。

我在这里做错了什么?

FIRST_DAY=$(date +%d)
LAST_DAY=$(date +%d)
MONTH=$(date +%m)
OUTPUT_FILENAME="usage_output.csv"
DBUSER=""
DBPASS=""

for ((i=1;i<=$#;i++)); 
do

    if [ ${!i} = "-sd" ] 
    then ((i++)) 
        let FIRST_DAY="${!i}";

    elif [ ${!i} = "-ed" ];
    then ((i++)) 
        let LAST_DAY="${!i}";

    elif [ ${!i} = "-m" ];
    then ((i++)) 
        let MONTH="${!i}";

    elif [ ${!i} = "-dbuser" ];
    then ((i++)) 
        let DBUSER="${!i}";

    elif [ ${!i} = "-dbpass" ];
    then ((i++)) 
        let DBPASS="${!i}";
    fi

done;

echo "${DBUSER}" "${DBPASS}"

命令行:

./get_gs_neotek_usage.sh -dbpass 123456 -dbuser tester -sd 1 -ed 5 -m 9

输出始终为

0 123456

无论我传递什么作为-dbuser的值。但是所有其他输入参数都按预期设置。

2 个答案:

答案 0 :(得分:2)

Bash将作业0中使用的任何字符串值转换为DBUSER="${!i}",只需使用let

var i = 0; do { if (document.onkeydown = keyPress) { i += 1; console.log(i); } } while (i < 5); function keyPress(m) { if (m.keyCode == '38') { i document.write("you moved North" + "<br>"); //up arrow } else if (m.keyCode == '40') { document.write("you moved South" + "<br>"); //down arrow } else if (m.keyCode == '37') { document.write("you moved West" + "<br>"); //left arrow } else if (m.keyCode == '39') { document.write("you moved East" + "<br>"); //right arrow } } 用于执行

答案 1 :(得分:1)

我建议使用正确的选项解析; getopts的限制在于它不能接受长参数,但它是标准POSIX,因此始终可用。

#!/bin/bash
FIRST_DAY=$(date +%d)
LAST_DAY=$(date +%d)
MONTH=$(date +%m)
OUTPUT_FILENAME="usage_output.csv"
DBUSER=""
DBPASS=""
while getopts ":s:e:m:u:p:" opt
do
    case $opt in
        s) 
            FIRST_DAY="$OPTARG"
            ;;
        e)
            LAST_DAY="$OPTARG"
            ;;
        m)
            MONTH="$OPTARG"
            ;;
        u)
            DBUSER="$OPTARG"
            ;;
        p)
            DBPASS="$OPTARG"
            ;;
        \?)
            echo "invalid option $OPTARG"
            exit
            ;;
        :)
            echo "$OPTARG requires an argument"
            exit
            ;;
    esac
done
echo "${DBUSER}" "${DBPASS}"