Когда и когда не использовать операторы [] с if?

Цитата X (7) :

С точки зрения пользователя , каждый X-сервер имеет отображаемое имя в форме:

 hostname: displaynumber.screennumber 
 

Каждый X-сервер имеет один дисплей (который может включать несколько мониторов или даже не мониторы вообще). Для использования нескольких дисплеев (в смысле X) требуется несколько серверов X; таким образом вы тоже получаете несколько мест.

Что касается совместного использования, я думаю, что каждый X-сервер ожидает «владеть» устройствами, которые он использует в любой момент времени, поэтому вы не можете получать ввод с одной клавиатуры, идущий на несколько X-серверов одновременно, или вывод несколько X-серверов, объединенных на одном мониторе. X-серверы могут отключать оборудование, что позволяет запускать X-серверы на нескольких VT и переключаться между ними (так обрабатываются одновременные входы в систему , например в GNOME). Вы также можете вложить некоторые X-серверы ( Xephyr , xpra ...), чтобы входные данные поступали на ваш основной текущий X-сервер и передавались на вложенный X-сервер в окне ; а вывод вложенного X-сервера отображается в окне главным X-сервером.

В Linux вы могли написать драйвер ввода мультиплексирования на уровне ввода для совместного использования устройств ввода, но это совсем другой уровень, чем X-сервер.

1
07.07.2017, 02:35
2 ответа

Использование конвейера позволяет запускать команды в разных подоболочках, поэтому вы получаете сообщение об ошибке, поскольку обе команды([иgrep)являются неполными (соответственно, не работают должным образом ).

Если вы просто хотите протестировать результирующий код программы, вам не нужно использовать [ … ]или test, они вам понадобятся только для более четкого сравнения, например [ 1 -gt 2 ]или [ "$1" == "$2" ]. Если вам нужны еще более сложные сравнения, такие как использование регулярных выражений, вы должны использовать команду [[ … ]], см. Тестовые конструкции . и Краткое введение в регулярные выражения в «Advanced Bash -Scripting Guide»

2
27.01.2020, 23:24

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

#! /bin/bash
read -p 'Want Task 1 ' 
if [ "${REPLY^}" = Y ] ; then
    echo 'Task One Done'

    read -p 'Want Task 2 ?? '
    if [ "${REPLY,}" = y ] ; then 
        echo 'Task 2 Done'
    fi
fi

Переменная по умолчанию для read$REPLY. При использовании ${REPLY^}вы получите содержимое в верхнем регистре, а при использовании ${REPLY,}— в нижнем. Поскольку переменная может быть пустой, вам нужно заключить ее в кавычки ".

Если вы действительно хотите вызвать внешнюю программу, такую ​​как grep, вы можете сделать это следующим образом:

read -p 'Want Task 1 ' 
if echo $REPLY | grep -icq ^y ; then
        echo 'Task 1 Done'
fi

Что на самом деле происходит выше, так это то, что мы запускаем команду, и если значение выхода не равно 0, это правда. Этот пример покажет это:

if /bin/true ; then
    echo We have always the yes hat on
fi

А [— это просто программа с именем /usr/bin/test. Ищите его в разделе man test.

1
27.01.2020, 23:24

Теги

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