这是我的脚本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"
或者,更好的是,你可以使用像切普纳在他的答案中显示的数组。