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