Pregunta

He intentado innumerables formas de obtener lo que quiero, pero nada parece funcionar. Siempre termino con algo como 2:not found.

¡Quiero capturar la salida de un comando, y luego probar si es igual a "!", Como así:

function test() {
  local testv=$(command) 2>/dev/null
  if [ $(#testv) == "!" ]; then
    echo "Exclamation mark!"
  else
    echo "No exclamation mark."
  fi
}

¿Cómo debo reescribir el código anterior para evitar el error? test:2: = not found?

¿Fue útil?

Solución

Esto debería funcionar:

if [ $testv = '!' ]; then

Hubo varios problemas aquí:

  • $(...) ejecuta un comando y sustituye su salida; Desea sustituir un valor variable, así que use $var o ${var}.
  • No tengo idea de lo que el # estaba haciendo allí. ${#var} Obtendrá la longitud de $ VAR, pero eso no es lo que quieres aquí.
  • los test comando (que [ es sinónimo de) no entiende ==, así que usa = (Si eres un programador C que se verá equivocado, pero esto es shell no c).
  • No creo que esto sea un problema en un script, sino para la entrada interactiva "!" No hace lo que esperas. solía '!' Para asegurarse de que el signo de exclamación no pueda interpretarse como una opción de historial.

Alternativamente, podrías usar [[ ]] en vez de [ ], ya que entiende == (y tiene una sintaxis algo más limpia en general):

if [[ $testv == '!' ]]; then

Por cierto, confío en la etiqueta que este script está ejecutando en ZSH; Si no, la sintaxis será un poco diferente (los shells básicos no tienen [[ ]], y cualquier otra cosa que no sea ZSH realizará un análisis no deseado en el valor de $ testv a menos que esté en quotas dobles). Si no está seguro (o quiere que sea portátil), aquí hay una versión que debería funcionar en cualquier shell que cumpla con POSIX:

if [ "$testv" = '!' ]; then

Otros consejos

Intenta con esto:

local testv=$(command 2>/dev/null)

ya que es la salida del comando que desea redirigir.

(No tengo idea de lo que quieres decir con $(#testv) aunque.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top