3

我的脚本接受键值对作为命令行参数。我测试给定数量的参数是否是偶数。如果偶数,我想遍历数组,将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
4

2 回答 2

5

尝试这样做:

for ((i=0; i<${#args[@]}; i+=2)); do
    PROPERTY="${args[$i]}"
    VALUE="${args[$i + 1]}"
    COMMAND="mycommand $PROPERTY $VALUE"
    bash -c "$COMMAND"
done

我建议不要使用大写字符作为变量名,保留这些字符作为您的内部系统变量

于 2013-03-17T22:15:01.460 回答
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" "$@"
于 2013-03-18T01:14:43.187 回答