'echo' bez znaku nowego wiersza w skrypcie powłoki

Mam problem z echo w moim skrypcie:

echo -n "Some string..."

Druki

-n Some string...

I przechodzi do następnej linii. W konsoli działa poprawnie bez nowej linii:

Some string...
Author: Falko, 2012-06-25

9 answers

Istnieje wiele wersji polecenia echo, o różnych zachowaniach. Najwyraźniej powłoka użyta w skrypcie używa wersji, która nie rozpoznaje -n.

Polecenie printf ma znacznie bardziej spójne zachowanie. {[0] } nadaje się do prostych rzeczy, takich jak echo hello, ale proponuję użyć printf do wszystkiego bardziej skomplikowanego.

Na jakim systemie jesteś i jakiej powłoki używa Twój skrypt?

 637
Author: Keith Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-11 18:51:56

bash posiada" wbudowane " polecenie o nazwie "echo":

$ type echo
echo is a shell builtin

Dodatkowo, istnieje polecenie" echo", które jest właściwym wykonywalnym (tj. widełki powłoki i execs /bin/echo, w przeciwieństwie do interpretacji echo i jej wykonania):

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

Zachowanie echo'S WRT do \c i -n jest różne. Najlepiej jest użyć printf, który jest dostępny na czterech różnych smakach * NIX, na które patrzyłem:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"
 168
Author: aqn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-23 21:22:05

Spróbuj z

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

Działa dla mnie zgodnie z oczekiwaniami(jak zrozumiałem z twojego pytania).

Zauważ, że otrzymałem tę informację ze strony man. Strona man zauważa również, że powłoka może mieć własną wersję echo i nie jestem pewien, czy bash ma własną wersję.

 97
Author: Sonny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 12:29:11

Aby to osiągnąć, istnieją zasadniczo dwie metody, których często używam:

1. za pomocą kursor escape character (\c) with echo -e

przykład :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -e flaga włączaE znaki scape w łańcuchu.
  • \c przynosiC ursor z powrotem do bieżącej linii.

lub

2. za pomocą printf polecenie

przykład :

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4
 12
Author: Genius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-26 09:29:45

Jeśli użyjesz echo wewnątrz if z innymi poleceniami, takimi jak" read", może zignorować to ustawienie i i tak przeskoczy do nowej linii.

 3
Author: Alexandre Strube,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 20:20:03

Tylko dla najpopularniejszego Linuksa Ubuntu & bash:

  1. Sprawdź, której powłoki używasz? Głównie poniżej działa, else zobacz to :

    echo $0

  2. Jeśli powyższe wydruki bash, to poniżej będzie działać:

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

 3
Author: Manohar Reddy Poreddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Wierzę, że teraz drukowanie wyjściowe jak poniżej

~ echo -e "String1\nString2"
String1
String2

Możesz użyć xargs, aby uzyskać wielowierszowy stdout w tej samej linii.

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

 ~
 1
Author: rɑːdʒɑ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-25 09:26:18
enable -n echo
echo -n "Some string..."
 1
Author: Riccardo La Marca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-16 09:29:01

Kiedy piszesz skrypt shell zawsze umieść pierwszą linijkę jako #!/ usr / bin / ENV bash . Powłoka ta nie pomija ani nie manipuluje sekwencjami escape. ex echo " This is first \N line" drukuje to jest pierwsza linia \N.

 0
Author: Amit Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-24 12:09:02