在bash脚本中使用位置参数

时间:2016-05-26 11:13:49

标签: bash unix

这是我的脚本script.sh

Numbr_Parms=$#
a=`expr $Numbr_Parms - 2`
while [ $a -le $Numbr_Parms ]
do
    if [ "$a" =  "3" ]
    then
       PARAMSTRING="-param $3"
    else
       PARAMSTRING="$PARAMSTRING -param $a"
    fi
    a=`expr $a + 1`
done
echo $PARAMSTRING

运行:

script.sh  username pass p1=v1 p2=v2 p3=v3

预期产出:

-param p1=v1 -param p2=v2 -param p3=v3

但我得到了:$PARAMSTRING

-param p1=v1 -param 4 -param 5

不确定4美元和5美元的问题是什么

3 个答案:

答案 0 :(得分:2)

如果您想跳过前两个位置参数,请使用

for arg in "${@:3}"; do
    PARAMSTRING+="-param $arg "
done

然而,建立一系列参数的正确方法是使用一个数组,即使其中一个参数本身包含空格,该数组也能正常工作。

for arg in "${@:3}"; do
    PARAMS+=(-param "$arg")
done

mycommand "${PARAMS[@]}"

答案 1 :(得分:0)

在:

PARAMSTRING="$PARAMSTRING -param $a"

您希望将参数附加到a位置。但是,$a只保留数字。要访问$1$2等,您必须使用variable indirection

PARAMSTRING="$PARAMSTRING -param ${!a}"

完整的脚本可以简化为参数的简单循环,使用$#作为限制:

for ((i=3; i<=$#; i++)); do
        PARAMSTRING="$PARAMSTRING -param ${!i}"
done
echo "$PARAMSTRING"

或者,更好的是,您可以在his answer中使用像chepner节目这样的数组。

答案 2 :(得分:0)

问题出在下面一行。

PARAMSTRING="$PARAMSTRING -param $a"

在这里,$ a并不代表位置参数。它是一个变量,它有4,5,只有那样。

如果打印该变量,则无法获得位置参数。你只得到4,5,6。

因此,您必须使用该变量获得位置参数。

尝试以下步骤,它将按预期工作。

Numbr_Parms=$#
a=`expr $Numbr_Parms - 2`
while [ $a -le $Numbr_Parms ]
do
    if [ "$a" =  "3" ]
    then
        PARAMSTRING="-param $3"
    else
        eval pos=\$$a    # This is the indirect reference to get the positional argument from variable a.
        PARAMSTRING="$PARAMSTRING -param $pos"
    fi
    a=`expr $a + 1`
done

echo $PARAMSTRING