Mam problem z ucieczką postaci w bash. Chciałbym uciec od pojedynczych i podwójnych cudzysłowów podczas uruchamiania polecenia dla innego użytkownika. Na potrzeby tego pytania powiedzmy, że chcę powtórzyć następujące na ekranie:
'single quote phrase' "double quote phrase"
Jak mogę uciec od wszystkich znaków specjalnych, jeśli muszę również przejść do innego użytkownika:
sudo su USER -c "echo \"'single quote phrase' \"double quote phrase\"\""
Oczywiście nie daje to właściwego rezultatu.
shell
quoting
escape-characters
m33lky
źródło
źródło
bash
jest na dobrej drodze do doprowadzenia mnie do szaleństwa.Odpowiedzi:
Możesz użyć następującej składni literału łańcuchowego:
Od
man bash
źródło
W powłoce POSIX, zakładając, że w ciągu nie ma rozszerzenia zmiennej, polecenia ani historii i nie ma nowego wiersza, postępuj zgodnie z tymi podstawowymi zaleceniami:
Aby zacytować ogólny ciąg z pojedynczymi cudzysłowami, wykonaj następujące czynności:
Zastąp dowolną sekwencję znaków spoza pojedynczego cudzysłowu tą samą sekwencją dodanymi wiodącymi i końcowymi pojedynczymi cudzysłowami:
'aaa' ==> ''aaa''
Ucieczka z ukośnikiem odwrotnym do każdego istniejącego pojedynczego cudzysłowu:
' ==> \'
W szczególności
''aaa'' ==> \''aaa'\'
Aby zacytować ogólny ciąg z podwójnymi cudzysłowami, wykonaj następujące czynności:
Dodaj wiodące i końcowe cudzysłowy:
aaa ==> "aaa"
Ucieczka odwrotnym ukośnikiem co znak podwójnego cudzysłowu i każdy znak odwrotnego ukośnika:
" ==> \", \ ==> \\
Kilka przykładów:
tak, aby twój przykład mógł zostać rozszerzony o:
źródło
Prosty przykład ucieczki cytatów w powłoce:
Odbywa się to poprzez ukończenie już otwartej jednej (
'
), umieszczenie klawisza Escape (\'
), a następnie otwarcie kolejnej ('
).Alternatywnie:
Odbywa się to poprzez ukończenie już otwartego jednego (
'
), umieszczenie cytatu w innym cytacie ("'"
), a następnie otwarcie kolejnego ('
).Powiązane: Jak uniknąć pojedynczych cudzysłowów w ciągach pojedynczych? w stackoverflow SE
źródło
Przyjęta odpowiedź działa na proste (jeden poziom) cytowanie:
Aby polecenie pojawiło się w działaniu, musisz zacytować dwa razy.
Ten skrypt może wykonać całą pracę:
Uruchom skrypt, aby uzyskać:
Pierwszy wiersz działa na proste echo:
Drugi wiersz będzie działał dla polecenia podwójnego cudzysłowu:
źródło
echo „Jestem studentem” nie działa. Ale następujące prace:
echo $ 'I \' ma student 'Ze strony podręcznika bash:
Pojedynczy cytat może nie wystąpić między pojedynczymi cudzysłowami, nawet jeśli poprzedzony jest odwrotnym ukośnikiem. .... 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.
źródło