Odpowiedzi:
echo -e ' \t '
wyświetli echo „spacja tabulacja spacja nowa linia” ( -eoznacza „włącz interpretację znaków ukośnika odwrotnego”):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -enie działa z Makefiles?
echo -enie jest POSIX i makewywołania, /bin/shktóre zwykle nie są używane przez program, używają interaktywnie i zwykle nie zostały -ezaimplementowane. Aby zapewnić przenośność, użyj printf '\t'zamiast tego.
manstrona echopolecenia nie wspomina o tej opcji -e. Ta opcja jest jednak akceptowana.
Użyj printf, nie echo.
Istnieje wiele różnych wersji echopolecenia. Istnieje /bin/echo(która może, ale nie musi być wersja GNU Coreutils, w zależności od systemu), a echopolecenie 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.
printfz drugiej strony ma znacznie mniejszą zmienność. Zwykle może istnieć jako polecenie /bin/printfi 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 --versioni --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 echozadział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 echoją zobaczyła.
echonadaje się do prostych wyników, takich jak echo hello world, ale powinieneś używać, printfgdy chcesz zrobić coś bardziej złożonego. Ty może dostać echosię do pracy, ale otrzymany kod może zawieść po uruchomieniu go z innej echorealizacji 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 ^Vw 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^Mpustego 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.
grepdo łapania linii zawierających tabznaki.
Używanie echa do drukowania wartości zmiennych jest częstą pułapką Basha. Link referencyjny: