Chcę zrobić coś takiego bzr commit -m "It works!"
. Mogę w ten sposób uciec od wykrzyknika bzr commit -m "It works\!"
. Jednak mój komunikat zatwierdzenia zawiera odwrotny ukośnik. Jak uciec od wykrzyknika, jednocześnie ignorując ukośnik?
bash
syntax
escape-characters
Mateusz
źródło
źródło
bzr commit -m "It works"!
prace.bzr commit -m "It works!"
Odpowiedzi:
Ponieważ nie jesteś zależny od bash do rozwijania zmiennych w komunikacie zatwierdzenia, możesz zamiast tego użyć pojedynczych cudzysłowów. Ciągi w pojedynczych cudzysłowach nie są rozwijane przez bash.
źródło
Oto kolejna metoda, jeśli chcesz podwójne cudzysłowy, a także wykrzyknik:
Działa to nawet wtedy, gdy
!
nie ma go na końcu linii.Na przykład:
Premia: Podobną technikę można zastosować, aby uciec przed dowolnym tekstem w Sh lub Bash (za pomocą sed): patrz pierwsza opcja w tej odpowiedzi . Ponadto, jeśli masz
bash-completion
zainstalowany, może mieć funkcja już dostępne.quote()
źródło
echo "Happy birthday!"
będzie działał zgodnie z oczekiwaniami, w przeciwnym razie możesz uciec z ukośnikiem odwrotnym, ale wydrukowany zostanie również ukośnik odwrotny XD Bash nie jest dla osób o słabym sercu :)echo "Happy Birthday!"
wyprowadza 2 linie. Pierwszy toecho "Happy birthday"
(bez wykrzyknika), a drugi to „Wszystkiego najlepszego” (znowu bez wykrzyknika). Czy masz włączone rozszerzanie historii podczas wykonywania tego testu?version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
zdecydowanie!
używany jest tylko jeden . Mam udziałhistexpand
w$SHELLOPTS
. Jednak właśnie wypróbowałem wersję 4.3.18 (2) na innym komputerze i działa ona tak, jak opisano. Chyba naprawiono błąd.Wyłącz rozszerzanie historii :
lub
Możesz dodać jedno z tych poleceń,
~/.bashrc
jeśli zwykle nie używasz rozszerzania historii.Bash 4.3 dodał specjalny przypadek :
źródło
set +o histexpand
, nieset -o histexpand
. Czy możesz edytować swoją odpowiedź, aby to naprawić?.bashrc
thx !!, nigdy nie używane!
w skryptach i na darmo !! zawsze było kłopotliwe ...echo "@AquariusPower!"
Używaj pojedynczych cudzysłowów (') zamiast podwójnych cudzysłowów ("). Pojedyncze cudzysłowy wyłączają wszelką interpretację zawartych w nich treści, podczas gdy podwójne cudzysłowy wyłączają tylko niektóre.
źródło
Właśnie znalazłem inny sposób, który będzie działał przynajmniej z
echo
ciągami (zdaniami), które chcesz interpunkować wykrzyknikiem. Robi to mniej więcej końcowy etap wokół rozszerzenia Bash i kodowanie zajmuje tylko trochę więcej czasu.Heks wykrzyknika, wymieniony na stronie http://www.ascii-code.com/ , wynosi 21, więc jeśli umieścisz
\x21
na końcu łańcuchaecho -e $foo
, zrób$foo
własne rozwinięte echo [tzn.foo=$(echo -e "$foo")
] zdobędziesz, gdyecho $foo
znowu będzie ciąg z!
na końcu. I nie ma też przełączania histexpand.Na pewno działa w Bash 4+. Wcześniejsze wersje, ymmv.
źródło
printf "OMG\041"
. Jeśli budujesz ciąg cudzysłowu w miejscu innym niż echo lub printf, tak jak zapytał OP o łańcuch zatwierdzenia, możesz osadzić go$(echo -e "\041")
w miejscu, w którym powinien znajdować się wykrzyknik. Tak:bzr commit -m "This is a great commit$(echo -e "\041")"
.