¿Por qué 'echo -n' no funciona en este script en mac terminal?

5

Estoy aprendiendo shell desde tutorialspoint hoy: enlace

Y copié este bloque de código en un archivo loop.sh :

#!/bin/sh

a=0
while [ "$a" -lt 10 ]    # this is loop1
do
   b="$a"
   while [ "$b" -ge 0 ]  # this is loop2
   do
      echo -n "$b "
      b='expr $b - 1'
   done
   echo
   a='expr $a + 1'
done

Pero cuando lo excuto, tengo cosas como:

...
-n 4
-n 3
-n 2
-n 1
-n 0
...

Aparentemente, el indicador -n no funciona en echo -n "$b " .

Luego muevo el mismo archivo a mi sistema virtual de Ubuntu. Lo ejecuta.

Tengo :

0
1 0
2 1 0
3 2 1 0
4 3 2 1 0
5 4 3 2 1 0
6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
8 7 6 5 4 3 2 1 0
9 8 7 6 5 4 3 2 1 0

Estoy confundido, aunque Ubuntu usa el guión como su sh predeterminado, pero OSX usa el bourne shell oficial como su sh , ¿por qué falló el script aquí? ¿Cómo solucionarlo?

    
pregunta Zen 21.02.2015 - 04:00

2 respuestas

12

Echo es tanto un programa binario ( /bin/echo ) como un comando incorporado en algunos shells como bash y sh. Como man echo afirma,

 Some shells may provide a builtin echo command which is similar or iden-
 tical to this utility.  Most notably, the builtin echo in sh(1) does not
 accept the -n option.  Consult the builtin(1) manual page.

Para solucionar esto, puedes cambiar tu script para usar bash configurando la primera línea en

#!/bin/bash

O cambia tu invocación de echo a

/bin/echo -n "$b "
    
respondido por el Alan Shutko 21.02.2015 - 04:08
8

echo no es portátil como lo experimentaste. Sugeriría utilizar la alternativa POSIX printf :

printf "$b "
    
respondido por el jlliagre 21.02.2015 - 12:47

Lea otras preguntas en las etiquetas