resumen respuestas págs méxico kuby johnson jhonson hotel estadística estadistica elemental descriptiva cecsa 7ma function shell fish

function - respuestas - Cáscara de pescado: comprobar si se proporciona argumento para la función



johnson r 1996 estadística descriptiva (5)

Al menos en fish 2.1+, puedes nombrar tus argumentos, lo que permite más código semántico:

function fcd --argument-names ''filename'' if test -n "$filename" open $filename else open $PWD end end

Estoy creando una función (a continuación) con la que puede proporcionar un argumento, un directorio. Compruebo si $argv es un directorio con la opción -d , pero eso no parece funcionar, siempre devuelve verdadero incluso si no se proporcionan argumentos. También probé la test -n $argv -a -d $argv para probar si $argv es una operación vacía, pero eso devuelve la test: Missing argument at index 1 error del test: Missing argument at index 1 . ¿Cómo debo probar si se proporciona algún argumento con la función o no? ¿Por qué no funciona la test -d $argv Desde mi entendimiento, debería ser falso cuando no se proporciona ningún argumento, porque la cadena vacía no es un directorio.

function fcd if test -d $argv open $argv else open $PWD end end

Gracias por la ayuda.


Tal vez no esté relacionado, pero me gustaría agregar otra perspectiva para la pregunta.

Quiero ampliar la información a un alcance más amplio el alcance de probar el código de shell con las bibliotecas desarrolladas en el grupo de pescadores.

Con el mock puede verificar si el comando de apertura se llama de forma segura sin efectos secundarios.

Ejemplo.:

function fcd if count $argv > /dev/null open $argv else open $PWD end end mock open 0 "echo /$args" fcd "cool" # echoes cool mock open 0 "echo /$args" fcd # echoes $PWD

Es una biblioteca reciente, pero podría ayudar a probar cosas que podrían ser peligrosas, como por ejemplo rm

mock rm 0 "echo nothing would happen on /$args" rm "some file" # simply echoes the message with a list of the files that would been affected

Espero que ofrezca un punto de vista más claro.

PD: Perdón por la publicidad descarada, pero creo que es una buena idea que sería bueno que los scripts de shell lo adopten, probar y agregar sostenibilidad a los scripts de shell es una locura. :PAG

EDITAR: recientemente noté un error sobre la muestra que publiqué. No use rm *, ya que el asterisco no se trata como un parámetro, en su lugar, fish shell expande el asterisco a la lista de archivos encontrados y el comando solo simula la primera llamada, esto significa que el primer archivo será ignorado por la simulación. pero todos los archivos subsiguientes se borrarán, así que tenga cuidado si prueba la muestra y use un solo archivo para el ejemplo, no para el comodín.


$argv es una lista , por lo que desea ver el primer elemento, si hay elementos en esa lista:

if begin; test (count $argv) -gt 0; and test -d $argv[1]; end open $argv[1] else open $PWD end


count es la forma correcta de hacer esto Para el caso común de verificar si hay argumentos, puede usar su estado de salida:

function fcd if count $argv > /dev/null open $argv else open $PWD end end

Para responder a su segunda pregunta, la test -d $argv devuelve verdadero si $argv está vacío, porque POSIX requiere que cuando se pasa un argumento a la test , debe "Salir de verdadero (0) si $ 1 no es nulo; de lo contrario, salir de falso". Entonces, cuando $ argv está vacío, test -d $argv significa test -d que debe salir de true porque -d no está vacío! Argh!

editar Se agregó un end faltante, gracias a Ismail por darse cuenta.


if not set -q argv[1] echo ''none'' else echo ''yes'' end

De la página de man set :

set ( -q | --query ) [SCOPE_OPTIONS] VARIABLE_NAMES...

o -q o --query test si los nombres de las variables especificadas están definidos. No genera ningún resultado, pero el estado de salida de los componentes es el número de variables especificadas que no se definieron.