Что (я думаю) вы пытаетесь сделать:
case-value)
if ... ; then
for ...; do
done
else
for ...; do
done
fi
;;
Что вы показали в своем вопросе:
case-value)
if ...; then
for ...; do
fi
done
;;
else
for ...; do
fi
done
;;
Первый fi
и первый ;;
оба посторонние.Второй fi
неуместен во втором цикле for
.
В редактировании, которое вы внесли в свой вопрос, вы, похоже, изменили тактику и теперь пытаетесь достичь своей цели одним for
цикл, содержащий if/else
, в отличие от if/else
с циклом for
в каждом предложении.Это определенно более эффективно, , но вы не можете использовать if/else
так, как вы пытаетесь.По крайней мере, не без лишней путаницы (на самом деле вы можете, но вам нужно избавиться от пары лишних |
с - см. Ниже).Поскольку ваше grep
выражение изменяется только на пару символов, вы можете просто сохранить выражение в переменной и использовать ваше if/else
для установки выражения:
u) MONTH=$OPTARG
if [[ "$MONTH" =~ ^[0-9]+$ ]]; then
grep_expr='\-'$MONTH
else
grep_expr=$MONTH
fi
for file in *eqllogmgr* ; do
ftx "$file" | layoutcc
grep "$grep_expr" "$file" |
perl -ne 'print if /-2018/' |
perl -pe 's/......-2018/\e[1;32m$&\e[0m/g' |
sed '$d'
echo
ft1
done
;;
Примечание: я также добавил некоторые цитатыудалил ненужные двоеточия и избавился от ненужной команды cat
(просто передайте имя файла непосредственно grep
- нет необходимости в дополнительной трубе).
* Оказывается, что вы пытались бы на самом делеработать, хотя лично я не думаю, что это очень кратко.Пример:
$ show=men
$ echo -e "Alice\nBob\nCarol\nDavid" | if [[ "$show" = "men" ]]; then egrep 'Bob|David'; else egrep 'Alice|Carol'; fi
Bob
David
$ show=women
$ echo -e "Alice\nBob\nCarol\nDavid" | if [[ "$show" = "men" ]]; then egrep 'Bob|David'; else egrep 'Alice|Carol'; fi
Alice
Carol