Manipulação de argumentos em um script para uma função "localizar" modificada?

Manipulação de argumentos em um script para uma função "localizar" modificada?

Estou usando o FreeBSD e entendo e uso a -pruneopção on findpara evitar que o comando desça para um subdiretório. Mas acho a sintaxe necessária muito desajeitada e estranha. Também não impede que o próprio diretório removido apareça, o que pode ser corrigido, mas irritante.

Eu gostaria de criar um pequeno script/alias que tenha o efeito de adicionar um novo -noenterargumento ao findcomandoseé fornecido antes de qualquer outra primária (para simplificar).

O objetivo é que eu possa digitar qualquer um dos seguintes:

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

e converterá os argumentos e executará:

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

mas também posso digitar normalmente qualquer comando de rotina "find" e ele será transmitido de forma transparente para /usr//bin/findexecução.

Logicamente, o script precisa identificar o primeiro argumento após o nome do diretório e depois testar se é:

  • ... igual -noentere seguido por pelo menos mais 2 argumentos (nesse caso eu sei como construir o argumento que preciso passar /usr/bin/findsabendo quais argumentos estavam antes/depois dele);ou
  • ... igual, -noentermas não seguido por pelo menos mais 2 argumentos (= erro);ou
  • ...qualquer outra coisa ou dir foi o último argumento ou não foi encontrado (= passar argumentos originais inteiros para /usr/bin/findinalterados).

Posso fazer tudo isso, exceto uma coisa: como codifico a parte do script que examina argv para saber qual número de argumento (se houver) é o dirargumento?

Minha escolha de shell é shpara scripts.

Responder1

Se o que você deseja é testar a existência e localização de um argumento específico, tudo o que você precisa fazer é analisar a linha de comando e testar cada argumento para uma correspondência com o seu valor "esperado". Então, você precisa testar cada argumento para o valor -noentere então imprimir uma linha informando a posição e o nome da variável -noenter:

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

Agora a mesma coisa, apenas a posição do argumento -noenteré armazenada $mitsose a posição do argumento antes disso em $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

e agora $mitsostem a posição de -noenterou nenhum valor e $maryo valor do argumento anterior -noenter. Neste ponto, if $marytem o valor /dirque vocêsabero próximo argumento é -noentere você pode continuar com sua implementação find, caso contrário você usará a versão do sistema ou imprimirá uma mensagem de erro. Finalmente, se você não se importa com a posição de -noentervocê pode omitir a linha mitsos=$i.

informação relacionada