3

私のスクリプトは、キーと値のペアをコマンド ライン引数として受け入れます。指定された数の引数が偶数かどうかをテストします。偶数の場合、配列を反復処理したい場合は、args[n]&args[n+1]をペア(n = 0 to $# - 1)と見なし、これら 2 つを引数として取る別のコマンドを実行します。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 ))

引数に配列を使用する必要はありません:

command="/mycommand"
while (( $# > 0 )); do
    property=$1
    value=$2
    shift 2
    ## Execute command
    "$command" "$property" "$value"
done

プロパティまたは値のいずれかに空白が含まれている場合、引用符は非常に重要です

ループの各反復で、単一のプロパティと値のみを使用してコマンドを実行するつもりだと思います。そうでない場合は、簡単に行うことができます:

"$command" "$@"
于 2013-03-18T01:14:43.187 に答える