Napisałem sobie program linuksowy, program
który wymaga wyrażenia regularnego jako danych wejściowych.
Chcę wywołać program w bash
powłoce i przekazać to wyrażenie regularne jako argument wiersza poleceń do programu (istnieją również inne argumenty wiersza poleceń). Wygląda typowe wyrażenie regularne
[abc]\_[x|y]
Niestety postacie [
, ]
i |
są postaciami specjalnymi w bash
. Tak więc dzwoniąc
program [abc]\_[x|y] anotheragument
nie działa Czy istnieje sposób na przekazanie wyrażenia za pomocą znaków specjalnych lub znaków cudzysłowu itp.?
(Wywołanie też program "[abc]\_[x|y] anotheragument"
nie działa, ponieważ interpretuje dwa argumenty jako jeden.)
źródło
"$HOME"
lub parametrów"${USER:-root}"
, zastąpienie polecenia albo w postaci"$(date)"
lub"`date`"
, arytmetycznego"$((1 + 2))"
rozszerzalności historii"!!"
lub odwróconą ucieczki"\\"
. Zamiast tego użyj pojedynczych cudzysłowów. Zobacz stronę manuala bash, rozdział zatytułowany „Cytowanie”.Użyj pojedynczych cudzysłowów. Pojedyncze cudzysłowy zapewniają, że żaden ze znaków nie zostanie zinterpretowany.
Istnieją dwa rozwiązania, jeśli chcesz umieścić pojedynczy cytat:
źródło
Za
man bash
źródło
Możesz użyć odwrotnego ukośnika (
\
) przed znakami specjalnymi, aby uciec przed nimi:źródło
Chociaż może to nie być przydatne jako wyrażenie regularne, niektóre sekwencje znaków mogą być interpretowane jako nazwy zmiennych Bash. Aby temu zapobiec i uniknąć rozszerzenia, użyj pojedynczych cudzysłowów zamiast podwójnych:
Cytuj każdy argument osobno (jeśli wymagają cytowania), aby były interpretowane jako niezależne argumenty. W niektórych przypadkach możesz także użyć tablic:
źródło
źródło
Ucieczka przed nimi powinna działać dobrze:
źródło
Skąd wziął się wzór? Czy to jest ustalone czy pochodzi od użytkownika? Czy to użytkownik wywołuje skrypt w systemie lokalnym, czy ktoś zdalny?
Używasz cudzysłowów do zawijania danych, aby powłoka nie mogła ich interpretować. Istnieją dwie opcje:
Ponieważ
$
jest poprawnym znakiem w wyrażeniach regularnych (koniec wiersza / bufor), prawdopodobnie chcesz użyć pojedynczych cudzysłowów do przechowywania wyrażenia regularnego, chyba że zapisujesz w zmiennej. Jeśli bierzesz dane z dowolnego ktoś zaufany, trzeba wymienić'
z'"'"'
czym zawinąć w pojedynczych cudzysłowach.Pamiętaj, że
[abc]_[x|y]
wygląda tak, jakbyś chciał dopasowaćx
luby
, podczas gdy w rzeczywistości pasuje do jednego z trzech znakówxy|
. Nawiasy kwadratowe pasują do znaków wewnątrz i tylko-
dla zakresów i a^
na początku dla negacji. Tak,[abc]_(x|y)
może być to, co myśli, i nawiasy są znaki, które są szczególne dla Shell. Nawiasy kwadratowe nie są specjalne dla powłoki, po prostu wygląda tak, jak są. Podwójne nawiasy kwadratowe[[ ... ]]
są wyjątkowe.źródło
'
z'"'"'
), jednak nadal nie jest poprawna.[
JEST specjalnym znakiem do powłoki, jest używany w symbolach wieloznacznych podczas ekspansji ścieżki (która powłoka robi dla wszystkiego, co nie jest cytowane).foo=a[b]
a potemecho $foo
sprawdzać, czy łańcuch nie wymaga cytowania. Masz rację, byłem zbyt krótki.ab
w bieżącym katalogu znajduje się plik , któryfoo
będzie zawierałab
zamiasta[b]
. Podaj swoje nawiasy kwadratowe, ludzie.setopt glob_assign
włączyć to zachowanie, więc cytowanie jest najbezpieczniejszą odpowiedzią.