Условные операторы Bash

Я редактирую C с Vim в консоли. Я использую make-файлы и имею много компиляторов для тестирования моего кода против, включая gcc, лязг (LLVM) и ICC. Другие вещи я рассматриваю часть своей среды разработки: использование grep, отладчиков и valgrind. Язык сценариев для более сложных сборок. Мерзавец для управления версиями.

Более важный в моем уме, чем то, что Вы используете для редактирования кода, - то, как Вы структурируете свой код. Как разметить, который является, вероятно, вопросом для Переполнения стека, но, поскольку Вы спросили, у меня часто есть отдельный каталог для объектного кода не для распределения и другой папки для результанта binar (y|ies). У меня есть папка тестирования, которая содержит больше файлов C, которые используют весь общий код, который я пишу и они я valgrind, наряду с заключительным файлом проекта.

2
07.01.2011, 22:05
1 ответ

Соответствующий раздел руководства удара перечисляет 5 различных конструкций, которые могут использоваться для условной оценки. Из них, if, case, и [[ .. ]] конструкции, вероятно, обычно используются в реальном коде, хотя (( .. )) конструкция будет часто привыкать в сценариях, которые делают сложный подсчет или другие числовые операции.

Но они не упоминают другую очень стандартную форму, используемую для ветвления в ударе, который должен просто выполнить команду в сочетании с оценкой короткого замыкания, например

grep -q needle haystack.txt && echo "Needle located!" || echo "No dice or needles.";

&& и || логические операторы: "и" и "или" соответственно.

Это - эффективно то же как

if grep -q needle haystack.txt; then echo "yea"; else echo "nay"; fi;

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

Это работает путем поиска легких путей: части выражения, например. x && y || z, оценены слева направо. Если левая сторона логического и, например, x в x && y, оценивает ко лжи, bash не потрудился оценивать y часть, потому что в той точке это уже знает это x && y ложь.

Обратное верно для логического ors: true || z всегда оценивает к истинному, независимо от того, чем оказывается z.

Таким образом, если grep выходит ложь, bash может пропустить это сначала echo, потому что та часть выражения не может возможно быть верной. Таким образом, это идет дальше к второму echo. С другой стороны, если grep является верным, первым echo выполняется (приводящий к тем, ну, в общем, отражаемым словам..). В этой точке bash сделан, потому что безотносительно значения правой стороны ||, результат выражения все еще будет верен.

Для получения ощущения пути работы удара с условными выражениями, лучше делать некоторое экспериментирование на командной строке. Команда

echo $?;

повторит код возврата предыдущего оператора. Это - код ошибки, таким образом, 0 верное средство, и ненулевое значение означает ложь. Это немного сбивает с толку сначала, но Вы привыкаете к нему.

Таким образом, можно сделать, например

$ (( 1 + 2 == 3 )); echo $?
0
$ (( 1 + 2 == 4 )); echo $?
1

и выполните подобные тесты с [[ .. ]] создайте для получения ощущения этих основных стандартных блоков. После того как Вам сделали это, движение к if и затем case операторы.

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

6
27.01.2020, 21:55

Теги

Похожие вопросы