Обработка аргументов в скрипте для измененной функции «find»?

Обработка аргументов в скрипте для измененной функции «find»?

Я использую FreeBSD и понимаю и использую опцию -pruneon, findчтобы предотвратить спуск команды в подкаталог. Но я нахожу необходимый синтаксис очень неуклюжим и неловким. Он также не предотвращает появление самого очищенного каталога, что поправимо, но раздражает.

Я хотел бы создать короткий скрипт/псевдоним, который будет добавлять новый -noenterаргумент к findкоманде.еслион дается перед любыми другими праймериз (для простоты).

Цель состоит в том, чтобы я мог набрать одно из следующего:

  • find -xs /dir -noenter '$*' -name '*.conf' -ls
  • find -x -s /dir -noenter '$*' -name '*.conf' -ls

и он преобразует аргументы и выполнит:

  • /usr/bin/find -xs /dir \( -name '$*' -prune -or \( -name '*.conf' -and ! \( -type d -and -name '$*' \) \) \) -ls
  • /usr/bin/find -x -s /dir \( SNIPPED \) -ls

но я также могу ввести как обычно любую обычную команду «find», и она будет прозрачно передана для /usr//bin/findвыполнения.

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

  • ... равно -noenterи за которым следуют как минимум еще 2 аргумента (в этом случае я знаю, как построить аргумент, который мне нужно передать, /usr/bin/findзная, какие аргументы были до/после него);или
  • ... равно, -noenterно не сопровождается как минимум еще 2 аргументами (= ошибка);или
  • ...что-либо еще или dir было последним аргументом или не было найдено (= передать все исходные аргументы /usr/bin/findбез изменений).

Я могу сделать все это, кроме одного — как мне закодировать часть скрипта, которая проверяет argv, чтобы определить, какой номер arg (если таковой имеется) является аргументом dir?

Я выбрал оболочку shдля написания скриптов.

решение1

Если вы хотите проверить наличие и местоположение определенного аргумента, все, что вам нужно сделать, это проанализировать командную строку и проверить каждый аргумент на соответствие вашему «ожидаемому» значению. Итак, вам нужно проверить каждый аргумент на значение, -noenterа затем вывести строку, указывающую положение и имя переменной -noenter:

for i in `seq 1 $#`; do
    ref=`eval "echo \\$$i"`
    if [ $ref == '-noenter' ]; then echo "arg $i is $ref"; break; fi
done

Теперь то же самое, только позиция аргумента -noenterсохраняется в $mitsos, а позиция аргумента перед ним — в $mary:

for i in `seq 1 $#`; do
  ref=`eval "echo \\${$i}"`
  if [ $ref == '-noenter' ]; then
    mitsos=$i
    eva=$(($i-1))
    mary=`eval "echo \\${$eva}"`
    break
  fi
done

и теперь $mitsosимеет позицию -noenterили не имеет значения и $maryзначение аргумента, предшествующего -noenter. В этот момент, если $maryимеет значение, которое /dirвызнатьследующий аргумент — -noenterи вы можете продолжить реализацию find, в противном случае вы используете версию системы или выводите сообщение об ошибке. Наконец, если вас не волнует положение , -noenterвы можете опустить строку mitsos=$i.

Связанный контент