2015-03-21 2 views
0

Мне нужно написать макрос, который получает несколько аргументов. например ./macro.sh -wrongone -f filename -wrongone. Я должен поймать неправильные и перечислить их и сделать требуемую операцию над действительными. Вот мой код:.Bash пропуская итерацию для

for i in "${ArrayOfParameters[@]}" 
do 
    tmp=$[tmp+1] 
    case "${i}" in 

    "-h" | "--help") 
     help 
     ;; 

    "-f") 
     a="${ArrayOfParameters[i+1]}" 
     echo $a 
     i=$[i+1]    
     ;;   

    *) 
     echo -e "${red}Parameter ${i} is wrong!${NC}" 
     ;; 
    esac 

done  

Моя проблема заключается в том, что я не знаю, как сделать «имя файла», чтобы быть пропущены при работе переключателя :(по умолчанию Каждый раз, когда я получаю сообщение об ошибке, что имя файла является неправильным параметром я. думал о том, пропустив одну итерацию. что-то вроде, что в C++.

for(int i=0;i<5;i++) 
if(i==3) 
i=4; 

Я хотел бы получить что-то подобное в Bash, но не знаю, как это сделать. Пробовал

for ((i=0; i<=5; i++)) 
a="${ArrayOfParameters[i]}" 

, но он возвращал мне все числа, а не строки. Я бы очень благодарен за полезные ответы.

ответ

2

Если я правильно понял, вы хотите пропустить следующий товар после того, как найдете -f, справа? Если это так, то вы можете использовать более C выглядящий синтаксис и играть с индексом массива , а не с массивом содержание

#!/bin/bash 

declare -a ArrayOfParameters=("-hello" "-howdy" "-foo bar" "-f" "-something else") 

for ((i=0; i <= ${#ArrayOfParameters[@]}; i++)) 
do 
    item=${ArrayOfParameters[i]} 
    echo "Studying item number ${i} (value: ${item})" 
    case "${item}" in 
     "-f") 
      echo "Found -f. Skipping next." 
      ((i++)) 
      ;;   
     *) 
      echo "NOT skipping ${item}" 
      ;; 
    esac 
done 

Вы увидите, что он пропустит деталь после -f:

Studying item number 0 (value: -hello) 
NOT skipping -hello 
Studying item number 1 (value: -howdy) 
NOT skipping -howdy 
Studying item number 2 (value: -foo bar) 
NOT skipping -foo bar 
Studying item number 3 (value: -f) 
Found -f. Skipping next. 
Studying item number 5 (value:) 
NOT skipping 
+0

Да, это код, который мне нужен! спасибо! – FilOle

+0

Хмм, хотя он все еще не работает, как я и предполагал: /. Тогда будут использовать другие решения: P. – FilOle

+0

@ user3593720, Если вы отредактируете свой вопрос, объясняя, почему это не работает по назначению, возможно, мы сможем работать над ним **; -) ** – BorrajaX

0

Я думаю, самое простое решением является использование переменного флага, который вы установили в true, если «-f» спичек и в начале вашего для цикла, проверьте, если этот флаг установлен, установите его на ложь и использование continue.

skipNext=false 
for i in "${ArrayOfParameters[@]}" 
do 
    if $skipNext 
    then 
     skipNext=false 
     continue 
    fi 
    tmp=$[tmp+1] 
    case "${i}" in 
     "-h" | "--help") 
      help 
      ;; 
     "-f") 
      skipNext=true 
      a="${ArrayOfParameters[i+1]}" 
      echo $a 
      i=$[i+1]    
      ;; 
     *) 
      echo -e "${red}Parameter ${i} is wrong!${NC}" 
      ;; 
    esac 
done 
+0

Неплохая идея спасибо !:) – FilOle

4

Не является прямым ответом на ваше кодирование проблемы, но я думаю, что вы должны делать себе пользу и использовать getopts (см here for a good tutorial). Параметры обработки, как правило, беспорядочны, и есть много угловых случаев, поэтому использование ваших собственных не всегда является хорошей идеей.

+0

GNU/Linux 'getopt (1)' гораздо более универсален, чем 'getopts'.Он не поставляется с каждой системой, хотя, особенно, не в семействе BSD, но его обычно достаточно легко установить с помощью диспетчера пакетов. – 4ae1e1

+0

Ищет простейшее решение. Кроме того, не знаю, какая система будет использоваться пользователем, поэтому нужно написать как можно больше универсального скрипта. – FilOle

+0

Я вижу. Тем не менее, обратите внимание, что вопреки 'getopt',' getopts' является частью bash и так долго. Поэтому, если вы можете хотя бы полагаться на то, что ваш сценарий требует bash, вы должны быть в безопасности. Если вы не можете полагаться на факт, что это bash, вам нужно быть осторожным с большим количеством вещей (арифметическое расширение, двойные кавычки в if и т. Д.), – tgo

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