shell:迭代数组

时间:2013-03-17 22:06:28

标签: bash

我的脚本接受键值对作为命令行参数。我测试给定数量的参数是否均匀。如果是偶数,我想迭代数组,请考虑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

2 个答案:

答案 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" "$@"