ácido reacciones reaccion oxidación oxidacion oleico monoinsaturados insaturados impar grasos enzimas cadena bacterias acidos shell sh

shell - reacciones - reaccion de oxidacion de acidos grasos insaturados



/ bin/sh: error de comparación de cadena impar ''operador inesperado'' (3)

Esta pregunta ya tiene una respuesta aquí:

Encontré este error bastante raro porque anteriormente mi script funcionaba pero después de moverlo del servidor en el que estaba trabajando a mi máquina local, dejó de funcionar y me dio un error de "operador inesperado".

# Else if the script is being run in the arrayscripts directory, add /output/ ... elif [ $basePath == "arrayscripts" ]; then echo "$dscr has started to run." cpuPath="`pwd`/output/cpu.binary" txtPath="`pwd`/output/cpu.txt" csvPath="`pwd`/output/cpu.csv"


Este es un error que obtendría si estuviera ejecutando el script con un shell POSIX como el dash . dash es el predeterminado /bin/sh en algunas plataformas como Ubuntu y Debian.

== es específico de bash ( Bashism ) y no es compatible con shells POSIX como dash , que usa only = para probar la igualdad de cadenas.

== y = se tratan como el mismo operador en bash , por lo tanto, se pueden usar.


Logré hacer funcionar mi script cambiando la función de comparación de ''=='' a ''='' como sugería ''alister'' en los foros de Unix y Linux ( http://www.unix.com/shell-programming-and- scripting / 141856-how-avoid-unexpected-operator-error-when-comparing-2-strings.html ) y mi script se veía así

# Else if the script is being run in the arrayscripts directory, add /output/ ... elif [ "$basePath" = "arrayscripts" ]; then echo "$dscr has started to run." cpuPath="`pwd`/output/cpu.binary" txtPath="`pwd`/output/cpu.txt" csvPath="`pwd`/output/cpu.csv"

Espero que si alguien obtiene el mismo error que yo, esta respuesta los ayude. .


Si su caparazón real es /bin/sh [al contrario de la pregunta inicial, pero como el comentario de la discusión ha dejado en claro], use = lugar de == en su expresión de prueba:

elif [ "$basePath" = arrayscripts ]

Tenga en cuenta que el lado derecho no necesita ser citado en este caso, ya que no contiene expansiones ni caracteres sensibles sintácticamente.

Alternativamente, si este problema es reproducible cuando se usa bash, el problema obvio es la falta de comillas.

Utilizar cualquiera

[ "$basePath" = arrayscripts ] # this is POSIX compatible

o

[[ $basePath = arrayscripts ]] # this works only with bash

De lo contrario, la cantidad de argumentos en los que se expande $basePath no está definida: se puede expandir a cero argumentos, haciendo que la declaración

[ = arrayscripts ]

... que trataría de usar = como unario operador, que no es ...

o si $basePath contenía, por ejemplo, "true -o bar =" , podría expandirse a algo así como

[ true -o bar = arrayscripts ]

... lo que resulta en un comportamiento del programa muy diferente de lo que realmente deseas.

En pocas palabras: cuando escriba para shells que siguen las reglas POSIX (básicamente, cualquier cosa menos zsh o fish), cite sus expansiones a menos que tenga una razón específica y convincente para hacerlo de otra manera. (El uso de la extensión bash / ksh [[ ]] proporciona una razón de este tipo, al introducir un contexto en el que la división de cadenas de los resultados de expansión y la expansión global no tienen lugar).