Как понять `если [! -f $ R_C_S_L / j_r_d *] ... `в Unix? - PullRequest
1 голос
/ 30 июля 2011

Пожалуйста, скажите мне, как отлаживать, как в следующих инструкциях в Unix. Как понять, что делает приведенный ниже код, шаг за шагом.

if [ ! -f $R_C_S_L/j_r_d* ]
    then
echo 0>$R_C_S_L/j_r_d
fi

Ответы [ 3 ]

4 голосов
/ 30 июля 2011
  • [ и ] окружают предикат.
  • ! - это предикат NOT, который отрицает все, что находится в скобках, от true до false.
  • -f - это предикат, файл существует?
  • $R_C_S_L - это переменная, определенная в другом месте.
  • * - это подстановочный знак.
  • then запускает блок if.
  • fi заканчивает блок if.
  • echo {stuff} выводит материал на экран.
  • echo {stuff} > {file} перенаправляет его в файл.

Приведенный выше оператор можно перевести таким образом:

"Если существует файл, который находится вкаталог $ R_C_S_L и начинается с букв j_r_d, затем записывает '0' в файл j_r_d в каталоге $R_C_S_L. "

см. $ man bash.

3 голосов
/ 30 июля 2011

Ну, вы читаете это слева направо:

 if [ ! -f $R_C_S_L/j_r_d* ]

Я думаю, if и [ понятно?

 man [

возвращает man test вверх, и там мы читаем:

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION

и далее вниз:

   -f FILE
          FILE exists and is a regular file

какой файл?

   $R_C_S_L/j_r_d*

анализируется слева, где $ указывает, что это переменная.Из написания переменных самостоятельно и склеивания их вместе я знаю, что он будет включать только L, поэтому $ R_C_S_L - это переменная, затем / - разделитель каталога, а j_r_d * - часть имени с шаблоном смещения.

Итак, ищется каталог, на который ссылается $ R_C_S_L, с файлом, соответствующим j_r_d *, это тест, и!является отрицанием, поэтому, если проверка не пройдена, внутренняя часть завершена.

 echo 0 > $R_C_S_L/j_r_d

записывает 0 в самый короткий файл, соответствующий указанному выше шаблону, если такого файла не существует.

3 голосов
/ 30 июля 2011

Это утверждение if / then ...

if [ I_AM_TRUE ]
then
   DO_ME
fi

then похоже на открывающую скобку, fi похоже на закрывающую скобку.

-f FILENAME ИСТИНА, когда FILENAME является файлом и ставит!перед этим выражением отображается значение истинности ...

, поэтому ! -f FILENAME равно TRUE, когда FILENAME не является файлом

echo печатает данные, а символ > принимаетэтот материал и перенаправляет его куда-то еще.Значение VAR можно получить, набрав $VAR ...

и, наконец, * является символом подстановки, поэтому он будет соответствовать всему (включая ничто!)

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

Для более полного списка вещей, которые вы можете проверить внутри if / thenвыписка с подтверждением http://en.wikipedia.org/wiki/Test_(Unix) или, как сказано выше, введите man test в командной строке.Это был бы мужественный способ сделать это.

...