Какой смысл Пустого оператора удара “:”, двоеточие?

Какой смысл "пустого" оператора в сценарии Bash? Я понимаю, что это используется в качестве заполнителя после if управляйте, когда Вы не будете иметь ничего для высказывания, но будете нуждаться в команде, чтобы позволить программе работать правильно. Но каково полное использование для него? Когда Вы использовали бы его? Когда имеет смысл использовать его?

13
задан 15 November 2014 в 02:21

6 ответов

Иногда полезно позволить побочным эффектам расширений параметра произойти.

, Например, устанавливая значение по умолчанию

read -p "Enter your name: " name
: ${name:=John Doe}  # if the user entered an empty string
echo "$name"
16
ответ дан 23 November 2019 в 03:10

Можно также использовать его для бесконечных циклов:

while : ; do 
   # ....
done
13
ответ дан 23 November 2019 в 03:10

Можно использовать его для создания файла, не запуская программу::

: > /path/to/file

Это бесконечно мало быстрее, чем touch /path/to/file (так как это не требует выполнения touch программа), и может быть незначительно более портативным, чем просто

> /path/to/file

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

if { : >> /path/to/file;} 2> /dev/null
then
    echo "writeable"
else
    echo "write permission denied"
fi

, хотя это, также, может обычно делаться без :. Протесты:

  • Этот doesn’t проверяет, существует ли файл уже. Если это doesn’t, это создаст файл, если это будет иметь разрешение сделать так.
  • , Если файл doesn’t существует, и Ваш сценарий, doesn’t имеют разрешение создать его, это сообщит о “write разрешении denied”.

(См. связанный вопрос по причинам, почему это более надежно, чем if [ -w /path/to/file ].)

9
ответ дан 23 November 2019 в 03:10

Я просто использовал его в сценарии с командами SSH для хранения сценария от erroring.

В этом случае, я хочу видеть, может ли пользователь соединиться с рядом серверов. Если соединение будет в порядке, то удаленный хост отзовется эхом хорошо. Если связь прервется, то SSH ответит ошибкой. Однако я хочу, чтобы мой сценарий вышел с 0 а не значение команды SSH, если это перестало работать. Таким образом, по существу я захватываю ошибку SSH осуществлением операции ИЛИ это || с пустой командой :. Похож на это:

#!/bin/bash
for i in $(cat servers.txt); do
    echo -n "$i "; 
    ssh user@${i} 'echo OK' || :; 
done

Тот путь я получаю вывод от SSH, но не кода ошибки:

....
swl06 ok
swl07 ok
swl08 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
swl09 ok
swl10 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
....
0
ответ дан 23 November 2019 в 03:10

Путь назад, в Unix V6 и Thompson Shell, : на самом деле использовался в качестве части goto оператор. Согласно руководству, это первоначально появилось в версии 3 Unix:

Весь командный файл ищется строку, начинающуюся a: как первый несимвол пробела, сопровождаемый одним или несколькими пробелами и затем маркировкой. Если такая строка найдена, goto меняет местоположение смещения командного файла к строке после маркировки и выходов. Это заставляет оболочку передавать маркированной строке.

В наше время, в bash, это не используется в качестве никакого-op оператора, возвращая успех. Действительно при рассмотрении исходного кода Вы будете видеть это оба true и : используйте ту же функцию, int colon_builtin(), внизу. Существует нет : невстроенная команда, и /bin/true на самом деле довольно большая команда для того, что она делает.

: мог использоваться где угодно true используется, например, в command_that_can_fail || true, хотя это, вероятно, смутит неспециалистов. Читайте больше об этом здесь.

5
ответ дан 23 November 2019 в 03:10

Можно использовать его на положительном тесте if управляйте, когда Вы только захотите сделать что-то на отрицательной стороне. Например:

if [[ True == False ]]; then
    :
else
    echo "true <> flase"
fi

Без : удар генерировал бы синтаксическую ошибку.

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

3
ответ дан 23 November 2019 в 03:10

Другие вопросы по тегам:

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