concha de pescado -eq y -a en una statement if

Estaba leyendo el guión de finalización de git.fish (/usr/local/Cellar/fish/2.1.2/share/fish/completions) para fish shell y me encontré con algunos problemas para entender lo que significa la syntax.

En el bloque,

function __fish_git_needs_command set cmd (commandline -opc) if [ (count $cmd) -eq 1 -a $cmd[1] = 'git' ] return 0 end return 1 end 

Entiendo que cmd se establece como commandline -opc . Pero en el siguiente enunciado (count $cmd) -eq 1 -a $cmd[1] = 'git' , ¿qué significan -eq y -a ?

Soy nuevo en Fish Shell y trato de entender la syntax al intentar escribir mi propio script de finalización para un progtwig. La ayuda sería muy apreciada.

Gracias.

De hecho, -eq y -a no son parte de la syntax de los peces. ¡Son arguments ordinarios!

 if [ (count $cmd) -eq 1 -a $cmd[1] = 'git' ] 

El corchete de apertura aquí es en realidad un command, como cat o grep. Realmente tienes un file /bin/[ . Puede ser más fácil de entender a través del command de test , que es lo mismo:

 if test (count $cmd) -eq 1 -a $cmd[1] = 'git' 

Ahora es fácil ver que -eq y -a son solo arguments ordinarios que pasan a test , sin significado sintáctico para los peces.

test tiene su propio lenguaje como awk o sed. Vea la man test para aprender sobre esto.

El -eq es una function de comparación entera .

La -a es una lógica y .

Entonces, el equivalente lógico sería algo así como:

 if [ (count $cmd) == 1 && $cmd[1] = 'git' ] 

(en pseudo-syntax Java).

Fondo

La razón por la que se usa -eq es porque un shell normalmente funciona solo con procesamiento de text. Como resultado, los numbers se almacenan en "cadenas". A veces, dos numbers son equivalentes, pero no equivalentes de cadena. Por ejemplo, el siguiente ejemplo:

 if [ "01" -eq "1" ] then echo "integer equal" fi if [ "01" = "1" ] then echo "string equal" fi 

Solo imprimirá un integer equal .

De la documentation de Fish :

  • NUM1 -eq NUM2 devuelve verdadero si NUM1 y NUM2 son numéricamente iguales.
  • COND1 -a COND2 devuelve verdadero si COND1 y COND2 son verdaderos.

Prueba eso (count $cmd) = 1 y ese $cmd[1] = 'git' .
( = aquí siendo igualdad, no una asignación).

Intereting Posts