Odpowiedzi:
echo -e ' \t '
wyświetli echo „spacja tabulacja spacja nowa linia” ( -e
oznacza „włącz interpretację znaków ukośnika odwrotnego”):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
nie działa z Makefiles?
echo -e
nie jest POSIX i make
wywołania, /bin/sh
które zwykle nie są używane przez program, używają interaktywnie i zwykle nie zostały -e
zaimplementowane. Aby zapewnić przenośność, użyj printf '\t'
zamiast tego.
man
strona echo
polecenia nie wspomina o tej opcji -e
. Ta opcja jest jednak akceptowana.
Użyj printf
, nie echo
.
Istnieje wiele różnych wersji echo
polecenia. Istnieje /bin/echo
(która może, ale nie musi być wersja GNU Coreutils, w zależności od systemu), a echo
polecenie jest wbudowane w większość powłok. Różne wersje mają różne sposoby (lub brak możliwości) określenia lub wyłączenia znaków zmiany znaczenia dla znaków kontrolnych.
printf
z drugiej strony ma znacznie mniejszą zmienność. Zwykle może istnieć jako polecenie /bin/printf
i jest wbudowany w niektóre powłoki (bash i zsh to mają, tcsh i ksh nie), ale różne wersje są znacznie bardziej do siebie podobne niż różne wersje echo
. I nie musisz pamiętać opcji wiersza poleceń (z kilkoma wyjątkami; GNU Coreutils printf akceptuje --version
i --help
, a wbudowany bash printf akceptuje-v var
przechowywanie danych wyjściowych w zmiennej).
Na przykład:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
A teraz nadszedł czas, żebym przyznał, że echo
zadziała równie dobrze w przypadku przykładu, o który pytasz; wystarczy wstawić podwójny cudzysłów wokół argumentu:
echo "[$res]"
jak napisał kmkaplan (dwa i pół roku temu, właśnie to zauważyłem!). Problem z oryginalnymi poleceniami:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
nie jest z echo
; polega na tym, że skorupa zastąpiła zakładkę spacją, zanim echo
ją zobaczyła.
echo
nadaje się do prostych wyników, takich jak echo hello world
, ale powinieneś używać, printf
gdy chcesz zrobić coś bardziej złożonego. Ty może dostać echo
się do pracy, ale otrzymany kod może zawieść po uruchomieniu go z innej echo
realizacji lub innej powłoki.
Możesz także spróbować:
echo Hello$'\t'world.
musisz użyć flagi -e dla echa, a potem możesz
echo -e "\t\t x"
Ze strony podręcznika użytkownika bash:
Słowa w postaci $ „string” są traktowane specjalnie. Słowo rozwija się do łańcucha znaków, a znaki specjalne z odwrotnym ukośnikiem są zastępowane zgodnie ze standardem ANSI C.
Możesz to zrobić:
echo $'hello\tworld'
Za pomocą klawiszy verbatim, ^V
( CTRL+V
, C-v
, cokolwiek ).
Podczas pisania ^V
w terminalu (lub w większości edytorów uniksowych) następujący znak jest pobierany dosłownie . Możesz użyć tego do wpisania literowego znaku tabulacji wewnątrz echa łańcucha.
Coś jak następujące prace:
echo "^V<tab>" # CTRL+V, TAB
Dokumenty Bash ( qv , „quoted-insert”)
quoted-insert (Cq, Cv) Dodaj kolejny wpisany znak do wiersza dosłownie. Oto jak wstawić sekwencje klawiszy, na przykład Cq.
uwaga dodatkowa: zgodnie z tym ALT+TAB
powinniśmy zrobić to samo, ale wszyscy związaliśmy tę sekwencję z przełączaniem okien, więc nie możemy jej użyć
tab-insert (M-TAB) Wstaw znak tabulacji.
-
Uwaga: możesz używać tej strategii z różnego rodzaju nietypowymi postaciami. Jak zwrot karetki:
echo "^V^M" # CTRL+V, CTRL+M
Wynika to z faktu, że znak powrotu karetki to ASCII 13, a M to 13 litera alfabetu, więc kiedy piszesz ^M
, otrzymujesz 13 znak ASCII. Możesz zobaczyć to w akcji, używając ls^M
pustego monitu, który wstawi znak powrotu karetki, powodując, że będzie on działał tak samo, jak trafiłeś return. Kiedy te znaki są normalnie interpretowane, dosłownie dostajesz dosłowny znak.
grep
do łapania linii zawierających tab
znaki.
Używanie echa do drukowania wartości zmiennych jest częstą pułapką Basha. Link referencyjny: