'echo' sans newline dans un script shell

541

J'ai un problème avec echodans mon script:

echo -n "Some string..."

impressions

-n Some string...

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

Some string...
qwertz
la source
2
Quelle implémentation de bourne shell utilisez-vous? Si je cours bashen mode shell bourne, cela fonctionne très bien ici. De plus, il est peu probable que vous utilisiez vraiment un shell bourne comme shell interactif, non?
FatalError
4
sur Ubuntu:echo -ne "text without new line: "; echo "some text";
zsoltii
Je sais que c'est très ancien, mais cela fonctionne pour moi dans Windows 10, pour ajouter un point sans retour à la ligne: echo | set / p = "."
SPlatten

Réponses:

574

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

La printfcommande a un comportement beaucoup plus cohérent. echoest bien pour des choses simples comme echo hello, mais je suggère d'utiliser printfpour quelque chose de plus compliqué.

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

Keith Thompson
la source
46
En commençant par la ligne, #!/bin/bashcela a fonctionné. Normalement, je travaille avec bash.
qwertz
Je souhaite qu'il y ait un équivalent Windows dans CMD :( Pour autant que je puisse voir, il n'y a pas, juste des solutions de contournement pour obtenir le même comportement.
kayleeFrye_onDeck
2
@kayleeFrye_onDeck: Il existe peut-être une version Windows de la printfcommande.
Keith Thompson
Je souhaite que. echoajoute toujours des nouvelles lignes ... La solution de contournement est au mieux jenky.
kayleeFrye_onDeck
2
@alper %est votre invite shell. Essayez ceci et regardez attentivement:printf hello; sleep 5
Keith Thompson
150

bash a 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 exécutable approprié (c'est-à-dire les fourches et les exécutables du shell /bin/echo, par opposition à son interprétation echoet son exécution):

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

Le comportement du echoWRT de l'un \cet de l'autre -nvarie. Votre meilleur pari est d'utiliser printf, qui est disponible sur quatre différentes saveurs * NIX que j'ai examinées:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"
aqn
la source
3
Merci pour la réponse massivement approfondie!
Dark Egregious du
91

Essayez avec

echo -e "Some string...\c"

Cela fonctionne pour moi comme prévu (comme je l'ai compris dans votre question).

Notez que j'ai obtenu ces informations sur la manpage. La manpage note également que le shell peut avoir sa propre version de echo, et je ne sais pas s'il basha sa propre version.

Fiston
la source
+1 pour m'avoir indiqué la bonne direction, bien que l'écho qui ne reconnaît pas l'option -ne ne reconnaisse probablement pas l'option -e (ni besoin) non plus donc vous voudrez probablement simplement dire à la echo "some string...\c"place. Si toutefois vous devez prendre en charge plusieurs variantes de bash avec des commandes d'écho très différentes, vous êtes probablement mieux d'utiliser printf ou vous devez 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 prend également en charge \ c, donc pas besoin d'utiliser le -n option, mais vous avez besoin du -e pour bash)
Timo
Pour moi, cela fait exactement ce que -n fait dans le cas de OP: génère littéralement -e. Je suppose que printf est en effet plus cohérent
aexl
-e ne fonctionnera pas dans un script shell posix, il sera plutôt affiché à l'écran.
Thomas Dignan
7

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

1. Utilisation du caractère d'échappement du curseur ( \c) avececho -e

Exemple :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eflag active les caractères E scape dans la chaîne.
  • \cramène le C urseur à la ligne actuelle.

OU

2. Utilisation de la printfcommande

Exemple :

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

Si vous utilisez echo à l'intérieur d'un if avec d'autres commandes, comme "read", il peut ignorer le paramètre et il sautera quand même sur une nouvelle ligne.

Alexandre Strube
la source
2

Juste pour le linux le plus populaireUbuntu et c'est bash:

  1. Vérifiez quel shell utilisez-vous? Surtout ci-dessous fonctionne, sinon voyez ceci :

    echo $0

  2. Si les impressions ci-dessus bash, alors ci-dessous fonctionnera:

    printf "hello with no new line printed at end"
    OU
    echo -n "hello with no new line printed at end"

Manohar Reddy Poreddy
la source
1

Je crois en ce moment votre impression de sortie comme ci-dessous

~ echo -e "String1\nString2"
String1
String2

Vous pouvez utiliser xargspour placer la sortie standard multiligne sur la même ligne.

 ~ echo -e "String1\nString2" | xargs
String1 String2

 ~
rɑːdʒɑ
la source
0

Lorsque vous allez écrire votre script shell, mettez toujours la première ligne sous #! / Usr / bin / env bash. Ce shell n'omet ni ne manipule les séquences d'échappement. ex echo "Ceci est la première \ n ligne" imprime Ceci est la première \ n ligne.

Amit Singh
la source
0
enable -n echo
echo -n "Some string..."
Riccardo La Marca
la source