Можно ли заменить «тогда» скобками?

10

Я впервые узнал, как кодировать на Cязыке, и с помощью

if ( code )
then 
code
fi

Мне очень трудно читать мой код (не спрашивайте почему). Есть ли замена then?

Что-то вроде этого:

if ( code ) {
 code
}
fi
智障 的 人
источник
Ответы, приведенные ниже, могут помочь, но, если я добавлю, очень полезно привыкнуть к синтаксису разных языков. Если вы хотите найти работу в разработке программного обеспечения, или devops, или как системный администратор в этом отношении, вам нужно научиться распознавать и использовать множество различных синтаксисов. Вы будете более ценными для любого работодателя, если будете максимально гибкими.
OldTimer

Ответы:

21

Там нет замены, но вы можете использовать оба, если вам действительно нужны скобки:

if true ; then {
    something
} fi

При этом в качестве тела блока используется ненужная явно заданная группа командthen . Любые команды в фигурных скобках будут просто выполняться в текущей оболочке при thenзапуске, точно так же, как если бы фигурные скобки отсутствовали.

Я бы не очень рекомендовал этот стиль в целом или для кода, который кому-то еще нужно будет прочитать, но он дает вам необходимые скобки, и он сработает, если вы используете редактор, который требует фигурные блоки или что-то подобное.

Майкл Гомер
источник
Вот еще один, который «не стоит рекомендовать» - в изобилии: { if { [[ a == aa ]];};then { echo yes;};else { echo no;}; fi;}- в основном, когда вы используете bashдостаточно, стандартный синтаксис становится достаточно знакомым, так что это не является большой проблемой.
Peter.O
15

Кажется, вы ищете оболочку C ( csh, tcshи т. Д.). Имейте в виду, что эксперты рекомендуют против этого для программирования .

Я не уверен, является ли та часть, которую вы считаете непривлекательной, фактом, который thenнаходится на следующей строке? Если это так, рассмотрите возможность использования следующего стиля:

if condition; then
    stuff
fi

Я должен признать, что правописание имен операторов задом наперед как fiдля ifи esacдля case(но не elihwдля while!) Является своего рода странным. Но это стандартная оболочка Bourne, самый переносимый синтаксис оболочки, который вы можете использовать.

Celada
источник
Спасибо за ваш ответ - я не нахожу thenнепривлекательным, просто мой редактор будет выделять соответствующие {}пары, и это полезно, когда у меня возникает какая-то ошибка, потому что тогда я могу легко увидеть все свои ifутверждения и посмотреть, если что-то пошло не так ,
Jun 的 人
1
О да. Это команда плюс vi, %которая переходит к соответствующей скобке / скобке / скобке. Я симпатизирую. Я скучаю по vi«s %команды при программировании на Python.
Селада,
8
Вы пробовали плагин matchit vim? Он поддерживает% jump для if / fi в bash и множество других блоков во многих других языках. Смотрите здесь - vim.org/scripts/script.php?script_id=39
amisax
@AmitKumar спасибо за совет. Я посмотрю!
Селада
9

Может быть, это проще для глаз

[ condition ] && {
   # statement 1
   # statment 2
   # ...
}

Кроме этого, просто привыкнуть к этому. Используйте языковые идиомы.

helpermethod
источник
1
Но потеряйте обычно ненужный башизм и просто используйте один набор скобок.
Иосип Роден
5

Следующее близко к там. И странно.

: if; { code; } && {
    code
}

Мне лично никогда не нравилось ...

if true; then
more;fi

... сформировать себя. Мне нравится, когда контрольные слова приводят . Мне всегда казалось странным, что преобладающая ...;thenформа появилась вообще.

if    this && that
then  do these things too
else  i will probably get upset
fi

Это почти полностью противоположно вашему запросу, но это еще один способ сделать это. Вы также можете прикрепить любые fiнужные перенаправления на линию по мере необходимости, и они будут применяться ко всему блоку.

mikeserv
источник
Эта преобладающая форма, кажется, является просто еще одним воплощением общего if(...) {, то есть оставляя открывающую скобку на той же строке, что и ifв C-подобных языках.
Руслан
@ Руслан - Возможно - но линия на самом деле не имеет никакого значения в C, не так ли?
mikeserv
Правильно, но при этом разрыв строки не имеет значения в оболочке, не так ли? Точка с запятой после условия уже заставляет интерпретатора искать продолжение ifкоманды, даже если на следующей строке.
Руслан
@Ruslan - да - ;в этом случае вы должны использовать разделитель. Вот почему они это делают.
mikeserv
Использование :встроенной оболочки, подобной этой, просто так, чтобы строка кода могла быть побайтно ближе к синтаксису C, никоим образом не должна поощряться.
Йосип Роден
0

Вот способ:

[ "$var" = "find" ] && echo "found"

эквивалентно:

if [ "$var" = "find" ]; then
  echo "found"
fi
serenesat
источник
Как он заявляет в вопросе, он хочет скобки . Положите немного {...}вокруг echo "found", и тогда вы будете двигаться в правильном направлении.
Peter.O
-2

Я всегда использую:

if (code); then
   code;
fi

Вероятно, не совсем то, что вы хотите, но это немного больше похоже на.

user1794469
источник
2
Это вызывает подоболочку, снижая производительность.
Будет