Definir string com os caracteres *, aspas simples e $

0

Eu crio scripts bash que são originados de outro script "principal" para configurar as variáveis necessárias pelo script principal. Essas variáveis precisam ser capazes de conter qualquer caractere e não tê-las interpretadas pelo shell. Por exemplo:

  • uma aspa simples: '
  • cifrão: $
  • asterix: *
  • sinal de libra: #, etc.

Então, meu pensamento era usar uma aspa simples e escapar de todas aspas simples e caracteres # . Mas estou recebendo um erro unexpected EOF while looking for matching com os dois arquivos abaixo.

Pergunta:

  1. Qual é a melhor maneira de definir uma string que possa conter qualquer conjunto de caracteres que exijam o mínimo de ajustes?

    Existem milhares desses arquivos foo.sh e como a string está sendo extraída de outra fonte, eu quero minimizar o número de caracteres especiais que eu preciso escapar.

  2. Quais outros personagens eu preciso escapar?

A saída desejada dos seguintes scripts abaixo é

\MyMacro{*,Baker's Dozen,$x^$,#}

Plataforma:

  • MacOS 10.9.5

Sub Shell: foo.sh

set -f
string_list='*,Baker\'s Dozen,$x^$,\#'
set +f

Shell principal: main.sh

source foo.sh
printf "%s{%s}" "\MyMacro" "${string_list}"
    
por Peter Grill 25.02.2016 / 13:26

2 respostas

1

Você não precisa escapar de # dentro da cotação, e é estranho ter uma cotação simples entre aspas simples:

string_list='*,Baker'\''s Dozen,$x^$,#'

Mas é mais fácil com aspas duplas. Então, algo como:

string_list="*,Baker's Dozen,\$x^\$,#"

funcionará.

Você precisa apenas de "\"" para aspas duplas, em vez de ''\''' para aspas simples, e também de escapar de $ para evitar a expansão das variáveis.

Se você quiser minimizar o escape, altere qualquer ' entre aspas simples para '"'"' :

string_list='*,Baker'"'"'s Dozen,$x^$,#'
    
por 25.02.2016 / 14:39
1

Você pode evitar qualquer escape, mas com um pouco mais de sobrecarga, usando algo assim:

string_list=$(cat <<\!eof!
*,Baker's Dozen,$x^$,#
!eof!
)

onde você cat stdin, que é um documento aqui, que não terá nenhum processamento feito para ele. Você pode até ter barras invertidas, aspas simples e duplas, espaços em branco e várias linhas na string. Para ser um pouco mais eficiente, você pode usar isto:

read string_list <<\!eof!
*,Baker's Dozen,$x^$,#
!eof!

mas você perderá qualquer espaço em branco inicial e qualquer barra invertida.

    
por 25.02.2016 / 18:15