2013-03-17 4 views
3

Мой скрипт принимает пары ключ-значение в качестве аргументов командной строки. Я проверяю, является ли заданное количество аргументов четным или нет. Если даже, я хочу перебрать массив, рассмотрим args[n] & args[n+1] как пару (n = 0 to $# - 1) и выполнить другую команду, которая примет эти два аргумента. Я не могу получить цикл for на месте. Вот мой код -shell: итерация по массиву

#!/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=("[email protected]") 
COMMAND="/mycommand " 
for ### WHAT SHOULD I WRITE HERE?? 
    PROPERTY=${args[$c]} 
    VALUE=${args[$c + 1]} 
    COMMAND="mycommand $PROPERTY $VALUE" 
    ## Execute command 
done 

ответ

5

Попробуйте сделать это:

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

Я рекомендую не использовать Капитализированное символы в качестве имени переменной, сохранить те, для внутренних системных переменных

+1

Не следует, чтобы цикл цикла повторялся n/2 раза, по крайней мере, в первом случае. Я все еще пытаюсь понять вторую часть. – devang

+0

Правда, сообщение отредактировано соответственно –

+0

Спасибо за предложение, я поменяю свой сценарий соответственно. – devang

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" "[email protected]" 
+0

Спасибо за ввод. – devang

Смежные вопросы