bash - Função para escapar do personagem?

1

Eu estou tentando automatizar algumas das minhas coisas e enfrentar um problema, o problema se resume a escapar do valor que está sendo passado como um argumento para o script.

myScript.sh

#!/bin/bash

loadPatch -name $1

onde $1 é o primeiro argumento e pode ter valor como 'p12.9.5-bug34'

Executando como

myScript p12.9.5-bug34

não produz resultado. Eu verifiquei com echo $? a saída foi bem-sucedida, mas a operação necessária não aconteceu.

Substitui $1 por esse valor real para testar no script e funcionou conforme o esperado. Não há como colocar uma declaração de impressão em loadPatch para verificar quais argumentos ela recebeu.

Então, eu imagino que há algum problema de escape aqui e, portanto, preciso saber, existe alguma função / utilidade que eu poderia usar para escapar do argumento antes de usar?

Por favor, deixe-me saber se você vê algum outro erro com isso?

    
por mtk 28.11.2012 / 15:51

2 respostas

4

Para responder à pergunta, porque outros podem pesquisar por este título:

  • somente zsh: print -r -- ${(q)var} ${(qq)var} ${(qqq)var} ${(qqqq)var} para diferentes tipos de cotação.
  • ksh93, zsh ou bash: printf %q "$var"
  • BusyBox (e todos acima).

    Uso de diferenças de nivelamento de vars entre ash, bash e ksh:

    q1="'"
    q2="'\''"
    printf '%s\n' "'${var//$q1/$q2}'"
    

    Não em traços e em shells antigos (os que estão faltando $ {var // pat / str}).

  • mais portável?

    printf "'%s'\n" "$(printf '%s' "$var" | sed "s/'/'\\''/g")"
    
    Or
    
    printf '%s\n' "$var" | sed "s/'/'\\''/g; 1s/^/'/; \$s/$/'/"
    

Melhorias de bom grado bem-vindas!

    
por 22.11.2015 / 06:09
0

Concordo que não deve haver um problema com caracteres especiais nesse nome de arquivo.

Descobri que às vezes os scripts não estão sendo executados na pasta que esperava. Se você substituir "loadPatch -name" por "echo", poderá verificar que $ 1 é o que você espera. Se é o que você espera, adicione essas linhas para ver se o diretório atual é o que você espera:

ls -l $1
pwd
    
por 28.11.2012 / 17:01