¿Manejo de argumentos en un script para una función "buscar" modificada?

¿Manejo de argumentos en un script para una función "buscar" modificada?

Estoy usando FreeBSD y entiendo y uso la -pruneopción findpara evitar que el comando descienda a un subdirectorio. Pero la sintaxis necesaria me parece muy torpe e incómoda. Tampoco evita que aparezca el directorio eliminado, lo cual se puede arreglar pero es molesto.

Me gustaría crear un script/alias breve que tenga el efecto de agregar un nuevo -noenterargumento al findcomando.sise da antes de cualquier otra primaria (por simplicidad).

El objetivo es que pueda escribir cualquiera de:

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

y convertirá los argumentos y ejecutará:

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

pero también puedo escribir normalmente cualquier comando de "buscar" de rutina y lo pasará de forma transparente para /usr//bin/findejecutarlo.

Lógicamente, el script necesita identificar el primer argumento después del nombre del directorio y luego probar si es:

  • ... igual -noentery seguido de al menos 2 argumentos más (en cuyo caso sé cómo construir el argumento al que necesito pasar /usr/bin/findsabiendo qué argumentos estaban antes/después de él);o
  • ... igual -noenterpero no seguido de al menos 2 argumentos más (= error);o
  • ... cualquier otra cosa o directorio fue el último argumento o no se encontró (= pasar los argumentos originales completos a /usr/bin/findsin modificaciones).

Puedo hacer todo esto excepto una cosa: ¿cómo codifico la parte del script que examina argv para saber qué número de argumento (si lo hay) es el dirargumento?

Mi elección de shell es shpara secuencias de comandos.

Respuesta1

Si lo que desea es probar la existencia y ubicación de un argumento específico, todo lo que necesita hacer es analizar la línea de comando y probar cada argumento para ver si coincide con su valor "esperado". Por lo tanto, debe probar el valor de cada argumento -noentery luego imprimir una línea que indique la posición y el nombre de la variable -noenter:

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

Ahora lo mismo, solo la posición del argumento -noenterse almacena en $mitsosy la posición del argumento anterior a ese en $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

y ahora $mitsostiene la posición de -noentero ningún valor y $maryel valor del argumento anterior -noenter. En este punto, si $marytiene el valor /dirquesaberel siguiente argumento es -noentery puede continuar con la implementación de find; de lo contrario, utilizará la versión del sistema o imprimirá un mensaje de error. Finalmente, si no le interesa la posición de -noenterpuede omitir la línea mitsos=$i.

información relacionada