在 bash 脚本中使用位置参数



这是我的脚本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 美元的问题是什么

如果你想跳过前两个位置参数,只需使用

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

但是,构建参数序列的正确方法是使用数组,即使其中一个参数本身包含空格,该数组也可以工作。

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

问题出在下面一行。

PARAMSTRING="$PARAMSTRING -param $a"

在这里,$a并不意味着立场论证。它是一个变量,它只有 4、5,就像这样。

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

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

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

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

在:

PARAMSTRING="$PARAMSTRING -param $a"

您希望将参数追加到位置a 中。但是,$a只保留数字。因此,要访问$1$2等,您必须使用变量间接寻址:

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

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

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

或者,更好的是,你可以使用像切普纳在他的答案中显示的数组。

相关内容

  • 没有找到相关文章

最新更新