es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo cambiar el shell predeterminado de sh a bash antes de ejecutar un script.

Tengo un script de shell con ciertos comandos que se ejecutan en una imagen de Docker alpine. Actualmente, utiliza la shell /bin/sh para ejecutar todos los comandos.

El problema es que en el script hay un bucle while que tiene un contador. El código siguiente:

i=0
cnt=15
while [ "$a" == "b" ] && [ "$i" == 15 ]
do 
  echo " Esperando ..."
  sleep 2s
  ((i=i+1))
  ((cnt=cnt-1))
done

El problema está en la línea ((cnt=cnt-1)), obteniendo el siguiente error:

sh: was: operando desconocido /bin/sh: salida: línea 178: Número ilegal: -1

Estaba pensando en cambiar de /bin/sh a /bin/bash, ¿puede ser esto una solución? Si es así, ¿cómo puedo establecer la shell predeterminada como bash antes de ejecutar el script? O utilizando la shell actual solamente, ¿cómo puedo resolver este problema del contador?

Por favor, sugiera.

EDITAR 1
La salida de : ls -l /bin/sh

$ ls -l /bin/sh
lrwxrwxrwx    1 root     root            12 Nov 12 09:18 /bin/sh -> /bin/busybox
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución

    El problema está en la operación aritmética ((cnt=cnt-1)) y en el uso del shell /bin/sh en el script. El mensaje de error sugiere que el operando -1 no es reconocido por el shell /bin/sh.

    Para resolver esto, podemos cambiar y usar el shell /bin/bash que tiene soporte para la mayoría de las características avanzadas de scripting, incluyendo operaciones aritméticas. Para hacer esto, necesitamos actualizar el script para usar el shell /bin/bash en lugar del shell /bin/sh.

    Al principio del script, añade la siguiente línea para establecer el shell predeterminado como /bin/bash:

    #!/bin/bash
    

    Esto asegurará que el script se ejecute utilizando el shell /bin/bash.

    Alternativamente, puedes llamar explícitamente al script con /bin/bash:

    /bin/bash script.sh
    

    Una vez que el script se esté ejecutando con el shell /bin/bash, el problema del contador debería resolverse.

    Editar 1:

    La salida del comando ls -l /bin/sh muestra que /bin/sh es un enlace simbólico a /bin/busybox. Busybox es una herramienta ligera de UNIX que provee varias herramientas comunes de UNIX en un solo archivo ejecutable.

    Busybox implementa una versión limitada del shell sh que puede no tener soporte para todas las características avanzadas de bash. Por lo tanto, es probable que la operación aritmética no sea reconocida por el shell sh de busybox.

    Cambiar al shell /bin/bash como se sugiere arriba debería resolver el problema.

Comments are closed.