Eu escrevi para mim mesmo um programa linux program
que precisa de uma expressão regular como entrada.
Quero chamar o programa no bash
shell e passar essa expressão regular como um argumento de linha de comando para o programa (também existem outros argumentos de linha de comando). Uma expressão regular típica parece
[abc]\_[x|y]
Infelizmente, os personagens [
, ]
e |
são caracteres especiais em bash
. Assim, chamando
program [abc]\_[x|y] anotheragument
não funciona Existe uma maneira de passar a expressão usando algum tipo de caractere de escape ou aspas, etc.?
(A chamada program "[abc]\_[x|y] anotheragument"
também não está funcionando, porque interpreta os dois argumentos como um.)
fonte
"$HOME"
ou parâmetros em expansão"${USER:-root}"
, substituem comandos sob forma"$(date)"
ou"`date`"
expansão aritmética"$((1 + 2))"
, expansão de histórico"!!"
ou escape de barra invertida"\\"
. Use aspas simples. Veja a página de manual do manual do bash, a seção intitulada "Citações".Use aspas simples. Aspas simples garantem que nenhum dos caracteres seja interpretado.
Existem duas soluções se você precisar incorporar uma única cotação:
fonte
Por
man bash
fonte
Você pode usar uma barra invertida (
\
) na frente de caracteres especiais para escapar deles da seguinte maneira:fonte
Embora possa não ser útil como uma expressão regular, algumas seqüências de caracteres podem ser interpretadas como nomes de variáveis do Bash. Para evitar que isso ocorra e evite expandi-los, use aspas simples em vez de aspas duplas:
Cite cada argumento separadamente (se precisar citar) para que eles sejam interpretados como argumentos independentes. Você também pode usar matrizes em alguns casos:
fonte
fonte
Escapá-los deve funcionar bem:
fonte
De onde vem o padrão? É fixo ou de um usuário? É o usuário que está chamando o script no sistema local ou alguém remoto?
Você usa aspas para agrupar os dados e impedir que o shell os interprete. Existem duas opções:
Como
$
é um caractere válido em regexps (fim de linha / buffer), você provavelmente deseja usar aspas simples para armazenar o regexp, a menos que esteja armazenando uma variável. Se você está tomando os dados arbitrária de alguém não confiável, você vai precisar para substituir'
com'"'"'
e em seguida, enrole em aspas simples.Observe que
[abc]_[x|y]
parece que você deseja corresponderx
ouy
, enquanto na verdade corresponde a um dos três caracteresxy|
. Os colchetes correspondem aos caracteres dentro e somente-
dos intervalos e a^
no início da negação. Então,[abc]_(x|y)
pode ser o que você quis dizer, e os parênteses são os caracteres especiais para o shell. Os colchetes não são especiais para o shell, apenas parecem que são. Os colchetes duplos[[ ... ]]
são especiais.fonte
'
por'"'"'
), no entanto, ainda não está correta.[
É um caractere especial para o shell, é usado em curingas ao fazer a expansão de caminho (que o shell faz para tudo que não é citado).foo=a[b]
e depoisecho $foo
ver que a sequência não precisa ser citada. Você está certo, eu fui muito breve.ab
no diretório atual efoo
conteráab
, em vez dea[b]
. Cite seus colchetes, pessoal.setopt glob_assign
habilitar esse comportamento, portanto, citar é a resposta mais segura.