Найдите результат используемым в если оператор

[112421] Этот раздел является созданным расширенным разделом, который затем содержит sda4, sda5 и sda6, которые являются логическими разделами. На жестком диске, отформатированном в MBR, можно разместить не более 4 физических разделов. Поэтому часто, если вам нужно создать расширенный раздел, который будет содержать любые логические разделы.

$ man bash
$ bind 'set revert-all-at-newline on'
$ man bsh # up arrow and edit
No manual entry for bsh
$ man bash # three up arrows

Смотрите эту [112758]ArchLinux Wiki о разметке[112759] для более подробной информации.[112424]

1
26.03.2015, 15:20
3 ответа

Как я уже говорил в моем комментарии, я предполагаю, что ваш вопрос на самом деле

Как использовать Найти Команда для проверки одного файла, чтобы увидеть Удовлетворяет ли это тест , например, размер = некоторое указанное число?

, где имя файла указывается как параметр к сценарию (и, таким образом, не известно вам заранее). Вы создаете ответ вокруг команды

if find . -name "$1" -size "$2"c | grep -q .
then
    echo OK
fi

Я взял свободу вставки цитат, которые рекомендуется DHAG. Это не плохое начало, но у него есть некоторые проблемы:

  1. Если пользователь запускает скрипт с помощью параметра test.txt , а также Существует файл под названием test.txt в подкаталоге текущего каталога , Тогда Найти найдет его и распечатайте его путь, и поэтому преуспеют . Но если ваш сценарий пытается сделать что-то с помощью файла под названием test.txt В текущем каталоге он не удастся, потому что такого файла нет.
    Вы можете исправить это, добавив -MaxDepth 1 Для предотвращения найти от поиска в подкаталогах.
  2. Если пользователь запускает сценарий с помощью параметра my_subdir / test.txt , Тогда найти , потерпит неудачу , потому что аргумент -NAME может не содержать скольжения.
  3. Если у вас действительно вредный пользователь, Он может напечатать «*» просто чтобы вызвать проблемы.

Использование Найти. кажется немного глупым Когда вы на самом деле не хотите искать дерево каталогов. Вы знаете имя файла; Вы просто хотите проверить свои свойства. Ну, если вы прочитаете между строками , найдите (1) с одним закрытым глазом, Вы понимаете, что на самом деле не говорит, что путь должны быть каталоги - это просто подразумевает это. Оказывается, что вы можете сказать

find  filename  [expression]

, применяемый к вашему вопросу, это становится

find "$1" -size "$2"c

как здравоохранение, я рекомендую:

if [ -f "$1" ]  &&  find "$1" -size "$2"c | grep -q .
then
    echo OK
fi

Чтобы не получить сообщение об ошибке из Найти Если указанный файл не существует вообще (и предотвратить вышеупомянутый озорной пользователь отдавая скрипт имя каталога).

0
27.01.2020, 23:27

Здесь существует три несвязанных использования @ .

В $ @ символ @ является именем автоматической переменной , которая может использоваться в правиле. Значение этой переменной является целью, которую строит правило.

Если @ используется в самом начале строки рецепта (команды) сразу после символа табуляции, команда не будет напечатана , когда она будет выполнена.

Символ @ в другом месте не является особым.

Таким образом, в вашем примере для построения программы :

  1. Вызывается функция file . Он записывает зависимости целевой переменной ( $ ^ автоматическая переменная) в файл program.in .
  2. Выполняется любая команда, сохраненная в переменной CMD , с параметрами, сохраненными в переменной CMDFLAGS , плюс дополнительный параметр @ program.in . Это зависит от того, что такое CMD .

  3. Команда rm program.in выполняется без предварительной печати.

Несколько команд рассматривают параметр, начинающийся с @ , как указывающий файл, из которого требуется прочитать дополнительные параметры. Это соглашение DOS, которое возникло, потому что DOS имел строгий предел длины командной строки и не путь интерполировать вывод команды в командную строку. Это редкость в мире Unix, так как Unix не имеет этих ограничений. Эффект рецепта, таким образом, вероятно, тот же, что и

$(CMD) $(CMDFLAGS) $(OBJECTS)
-121--41555-

ps получает всю его информацию из смонтированных procfs, поэтому без procfs нет источника для получения этой информации. Единственный вариант, который я вижу, это монтировать proc для вызова ps/top, а затем демонтировать его, что минимизирует риск.

-121--128792-

Возможно, простой перенос выходных данных find в grep сделает следующий трюк:

if find . -name test.txt -size 156c | grep -q .; then echo Found; fi

Вызов find не будет иметь выходных данных, если не будет найден файл, соответствующий заданным вами условиям имени и размера, и grep. будет иметь статус выхода 0 («true»), только если его вход не пуст. Опция -q просит не печатать никаких выходных данных, что не имеет значения здесь, потому что нас волнует только статус выхода.


Чтобы устранить еще один возможный источник путаницы: поскольку @ derobert упоминается в комментарии, скобки не являются частью синтаксиса конструкции , если вообще: вы обнаружите, что существует команда с именем [, которая выполняет задачу вычисления логического выражения и возврата их истинного значения в виде кода выхода ( [ также может быть встроенной оболочкой); эта команда проверяет наличие закрывающей скобки:

$ [ 3 -gt 2 ] ; echo $?
0

$ [ 3 -lt 2 ] ; echo $?
1

$ [ 3 -lt 2 ; echo $?
bash: [: missing `]'
2

В приведенных выше командах 0 означает true, 1 означает false, а 2 сигнализирует об ошибке.

3
27.01.2020, 23:27

Подобно решениям grep , предлагаемым в другом месте, но, возможно, проще, вы можете просто прочитать единственная строка из , находка . Это гарантирует, что find завершит работу (потому что read определенно будет) при первом совпадении и даст вам надежное возвращаемое значение.

find . -name test.txt -size 156c | 
read -r na && echo ok || ! echo shite

... должно работать нормально. Если find что-то напечатает, у него будет завершающийся символ новой строки, поэтому read вернет true даже для одного совпадения из find , но если find ничего не печатает, тогда read достигнет EOF перед чтением электронной строки \ n , и поэтому он вернет ошибку.

0
27.01.2020, 23:27

Теги

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