Как я выхожу из сценария в условном операторе?

Вот что-то, что должно работать без использования, находят. Различием от ответов, уже отправленных, является порядок правил фильтра. Правила фильтра в команде rsync работают много как iptable правила, первое правило, что файл соответствует, является тем, которое используется. Из страницы руководства:

Поскольку список файлов/каталогов для передачи создается, rsync проверяет, что каждое имя, которое будет передано против списка, включает/исключает шаблоны в свою очередь, и первый шаблон соответствия действуется на: если это - исключить шаблон, то тот файл пропускается; если это - включать шаблон затем, что имя файла не пропускается; если никакой шаблон соответствия не найден, то имя файла не пропускается.

Таким образом Вам нужна команда следующим образом:

rsync -avn --include="**.pdf" --exclude="*" ~/LaTeX/ ~/Output/

Отметьте шаблон "**.pdf". Согласно странице справочника:

если шаблон содержит / (не подсчет запаздывания/) или "**", то это подобрано против полного пути, включая любые ведущие каталоги. Если шаблон не содержит / или "**", то он подобран только против заключительного компонента имени файла. (Помните, что алгоритм применяется рекурсивно, таким образом, "полное имя файла" может на самом деле быть любой частью пути от начального каталога на вниз

В моем маленьком тесте это действительно работает рекурсивно вниз дерево каталогов и только выбирает pdfs.

50
04.11.2011, 17:01
5 ответов

Вы могли сделать тот этот путь:

[[ $(id -u) -eq 0 ]] || { echo >&2 "Must be root to run script"; exit 1; }

("обычное" условное выражение с арифметическим бинарным оператором в первом операторе), или:

(( $(id -u) == 0 )) || { echo >&2 "Must be root to run script"; exit 1; }

(арифметическая оценка для первого теста).

Заметьте изменение () -> {} - фигурные скобки не порождают подоболочку. (Поиск man bash для "подоболочки".)

52
27.01.2020, 19:33
  • 1
    Выйдите с кодом кроме нуля, примера: exit 1 для создания, понимают родительский процесс, что проблема произошла. разделители полей –  SamK 04.11.2011, 18:32
  • 2
    Вы не должны использовать [[ для числового сравнения использовать ((. –  Chris Down 04.11.2011, 21:59
  • 3
    @ChrisDown [[ прекрасен, пока Вы используете -eq вместо ==. –  Let_Me_Be 24.11.2011, 12:10
  • 4
    Зафиксированный условное выражение, добавила арифметическая версия, @ChrisDown. –  Mat 24.11.2011, 12:27
  • 5
    @Mat Между прочим, можно сократить его к (( EUID )) && ... –  Chris Down 24.11.2011, 13:14

Круглые скобки вокруг тех команд создают подоболочку. Ваша подоболочка echos "Должна быть корнем для запущения скрипта", и затем Вы говорите подоболочке выходить (хотя это уже имело бы, так как больше не было команд). Самый легкий способ зафиксировать его состоит в том, чтобы, вероятно, просто использовать if:

if [[ `id -u` != 0 ]]; then
    echo "Must be root to run script"
    exit
fi
21
27.01.2020, 19:33
  • 1
    Таким образом, нет никакого способа сделать это с остротой? –  Garrett Hall 04.11.2011, 17:16
  • 2
    Ваша логика назад. в Вашем примере, если id -u == 0, который означал бы, что Вы - корень. Вы хотите [[ $(id -u) != 0 ]]; then. –  Tim Kennedy 04.11.2011, 19:32
  • 3
    Если Вы,/must/имеют остроту, примерьте это для размера: [ "$UID" != 0 ] && echo 'You have to be root.' && exit 1; Также отметьте $UID, который сохраняет порождение процесса. Я думаю, что Вы могли бы даже предпочесть $EUID. –  janmoesen 04.11.2011, 20:19
  • 4
    @janmoesen, положительная сторона. И, в то время как крошечный имейте переменную с числовым значением: ((UID)) && echo 'You have to be root.' && exit 1. –  manatwork 04.11.2011, 20:25
  • 5
    @janmoesen: обратите внимание, что использование такой обратной логики вызовет сценарий это set -e прерываться. Одно решение той проблемы [ "$UID" != 0 ] && echo 'You have to be root.' && exit 1 || true. –  sam hocevar 05.11.2011, 00:14

Скобки вокруг || и && не требуются, поскольку они правоассоциативные. Следующие два выражения эквивалентны:

expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }

Так && вместо ; работал бы просто великолепно, как echo возвратит true.

[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
1
27.01.2020, 19:33
  • 1
    В то время как все, что Вы сказали, корректно, это - плохой шаблон для изучения, потому что Вы полагаетесь на возвращаемое значение expr2. Вы уверены, что эхо будет всегда возвращать 0 статусов выхода? Это - намного лучшая идея сгруппировать операторы с фигурными скобками и точками с запятой. Это - такая распространенная ошибка, что она имеет свою собственную запись в BashPitfalls: mywiki.wooledge.org/BashPitfalls#cmd1_.26.26_cmd2_.7C.7C_cmd3 –  Flimm 11.11.2011, 01:10
  • 2
    @Flimm: Я не соглашаюсь, что это - плохой шаблон. Очевидно, это использует, иждивенец случая и также зависит от Вашего знания возвращаемых значений, которые Вы получите. В этом случае я уверен, что эхо возвратится 0 99,999% времен, и если оно будет топать на ошибке при записи (единственный случай, то оно не возвратится 0) существует большая проблема, чем этот expr. Там также имеет место, где ВЫ генерируете возвращаемые значения, таким образом, не, это не "плохой шаблон" по сути для меня. –  ata 11.11.2011, 02:18
  • 3
    , который я добавлю также, как он говорит в Wiki, что необходимо использовать его, если уверенный для понимания оценки C. Так или иначе немного тестирования должно очистить любые неоднозначности. –  ata 11.11.2011, 02:26

С помощью bash:

[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
2
27.01.2020, 19:33

это может вам помочь в bash

[oracle@rac1 ~]$ which bash
/bin/bash
[oracle@rac1 ~]$ cat test1.sh
if [ `id -u` != 0 ]
then
echo "Must be root to run the script
 "
exit
fi
0
27.01.2020, 19:33

Теги

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