Perché 'echo -n' non funziona in questo script sul terminale mac?

5

Sto imparando shell da tutorialspoint oggi: link

E ho copiato questo blocco di codice in un file 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

Ma quando lo salvo, ho cose come:

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

A quanto pare, il flag -n non funziona in echo -n "$b " .

Quindi sposto lo stesso file sul mio sistema virtuale Ubuntu. Lo esegue.

Ho ricevuto:

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

Sono confuso, anche se Ubuntu usa dash come predefinita sh , ma OSX usa bourne shell ufficiale come sh , perché lo script ha fallito qui? Come risolverlo?

    
posta Zen 21.02.2015 - 04:00
fonte

2 risposte

12

Echo è sia un programma binario ( /bin/echo ) che un comando incorporato in alcune shell come bash e sh. Come man echo afferma,

 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.

Per risolvere questo problema, puoi cambiare lo script per utilizzare bash impostando la prima riga su

#!/bin/bash

O modifica la tua chiamata di echo a

/bin/echo -n "$b "
    
risposta data 21.02.2015 - 04:08
fonte
8

echo non è portabile come hai avuto esperienza. Suggerirei di usare l'alternativa POSIX printf :

printf "$b "
    
risposta data 21.02.2015 - 12:47
fonte

Leggi altre domande sui tag