622 votes

shell script : echo sans nouvelle ligne

J'ai un problème avec echo dans mon script :

echo -n "Some string..."

imprime

-n Some string...

et passe à la ligne suivante. Dans la console, cela fonctionne correctement sans nouvelle ligne :

Some string...

2 votes

Quelle implémentation du bourne shell utilisez-vous ? Si j'exécute bash en mode bourne shell, cela fonctionne bien ici. De plus, il est peu probable que vous utilisiez réellement un shell bourne comme shell interactif, non ?

6 votes

Sur Ubuntu : echo -ne "text without new line: "; echo "some text";

0 votes

Je sais que c'est très ancien, mais cela fonctionne pour moi sous Windows 10, pour ajouter un point sans nouvelle ligne : echo | set /p=".".

669voto

Keith Thompson Points 85120

Il existe plusieurs versions de l'ouvrage echo avec des comportements différents. Apparemment le shell utilisé pour votre script utilise une version qui ne reconnaît pas -n .

Le site printf a un comportement beaucoup plus cohérent. echo est très bien pour des choses simples comme echo hello mais je suggère d'utiliser printf pour tout ce qui est plus compliqué.

Sur quel système êtes-vous, et quel shell votre script utilise-t-il ?

54 votes

En commençant par la ligne #!/bin/bash ça a marché. Normalement, je travaille avec bash.

0 votes

J'aimerais qu'il y ait un équivalent Windows dans CMD :( Pour autant que je puisse voir, il n'y en a pas, juste des solutions de contournement pour obtenir le même comportement.

2 votes

@kayleeFrye_onDeck : Peut-être qu'il y a une version Windows de la printf commandement.

180voto

aqn Points 470

bash possède une commande "intégrée" appelée "echo" :

$ type echo
echo is a shell builtin

De plus, il existe une commande "echo" qui est un véritable exécutable (c'est-à-dire que l'interpréteur de commandes bifurque et exécute /bin/echo par opposition à l'interprétation echo et l'exécute) :

$ ls -l /bin/echo
-rwxr-xr-x 1 root root 22856 Jul 21  2011 /bin/echo

Le comportement de l'un ou l'autre echo de la WRT à \c et -n varie. Votre meilleure chance est d'utiliser printf qui est disponible sur quatre versions différentes de *NIX que j'ai examinées :

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"

1 votes

C'est une réponse importante, car elle permet de faire la distinction entre echo en tant que commande et echo en tant qu'exécutable, ce qui n'est pas forcément évident lorsqu'on écrit des scripts. Cela signifie que si vous voulez vraiment obtenir le comportement par défaut de l'écho auquel vous êtes habitué, vous pouvez vous assurer que vous utilisez l'exécutable en utilisant /bin/echo -n pour obtenir l'affichage sans nouvelle ligne. printf peut être une meilleure option, mais si vous avez l'habitude d'utiliser echo, vous pouvez toujours obtenir la fonctionnalité que vous attendez de cette façon.

101voto

Sonny Points 448

Essayez echo -e "Some string...\c" . Cela fonctionne pour moi comme prévu (c'est-à-dire, comme j'ai compris de votre question). PS : Notez que j'ai obtenu ces informations à partir de la page de manuel. La page de manuel note également que le shell peut avoir sa propre version d'echo, et je ne suis pas sûr que bash ait sa propre version. Quelqu'un ?

1 votes

+1 pour m'avoir indiqué la bonne direction, bien que l'écho qui ne reconnaît pas l'option -ne ne reconnaît probablement pas non plus l'option -e (ni le besoin), donc vous voudrez probablement dire simplement echo "some string...\c" à la place. Cependant, si vous devez supporter plusieurs variantes de bash avec des commandes d'écho très différentes, il est probablement préférable d'utiliser printf ou de vérifier les capacités des commandes d'écho avec quelque chose comme [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c" (au moins bash supporte \c aussi, donc pas besoin d'utiliser l'option -n, mais vous avez besoin de l'option -e pour bash)

0 votes

Pour moi, cela fait exactement ce que -n fait dans le cas de l'OP : sortir le littéral -e. Je suppose que printf est en effet plus cohérent

1 votes

-e ne fonctionnera pas dans un shell posix script, il sera affiché à l'écran à la place.

13voto

Genius Points 1104

Pour y parvenir, il existe essentiellement deux méthodes que j'utilise fréquemment :

1. Utilisation de la curseur caractère d'échappement ( \c ) avec echo -e

Ejemplo :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -e active l'option E les caractères de la chaîne de caractères.
  • \c apporte le C ursor de retour à la ligne actuelle.

OU

2. Utilisation de la printf commande

Ejemplo :

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4

3voto

Si vous utilisez echo à l'intérieur d'un si avec d'autres commandes, comme "read", il se peut que le paramètre soit ignoré et qu'il saute à une nouvelle ligne de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X