我的脚本接受键值对作为命令行参数。我测试给定数量的参数是否均匀。如果是偶数,我想迭代数组,请考虑args[n]
& args[n+1]
作为一对(n = 0 to $# - 1)
并执行另一个命令,将这两个作为参数。我无法获得for循环。这是我的代码 -
#!/bin/sh
usage() {
echo "$0 <property-name> <property-value> [<property-name> <property-value> ...]"
exit 1
}
if [ $# -lt 2 ] ; then
usage
fi
# Should be even number of arguments
if [ $(( $# % 2 )) -ne 0 ]
echo "Even number of arguments expected."
usage
fi
args=("$@")
COMMAND="/mycommand "
for ### WHAT SHOULD I WRITE HERE??
PROPERTY=${args[$c]}
VALUE=${args[$c + 1]}
COMMAND="mycommand $PROPERTY $VALUE"
## Execute command
done
答案 0 :(得分:5)
尝试这样做:
for ((i=0; i<${#args[@]}; i+=2)); do
PROPERTY="${args[$i]}"
VALUE="${args[$i + 1]}"
COMMAND="mycommand $PROPERTY $VALUE"
bash -c "$COMMAND"
done
我建议不要使用CAPITALIZED字符作为变量名,保留那些内部系统变量
答案 1 :(得分:3)
首先请注意,这看起来很尴尬
if [ $(( $# % 2 )) -ne 0 ]
改为使用单个算术表达式:
if (( ($# % 2) != 0 ))
没有必要为args使用数组:
command="/mycommand"
while (( $# > 0 )); do
property=$1
value=$2
shift 2
## Execute command
"$command" "$property" "$value"
done
如果任何属性或值包含空格
,则引用非常重要我假设您打算在循环的每次迭代中只使用一个属性和值来执行命令。如果没有,你可以简单地做:
"$command" "$@"