Jquery como templates para formatação de strings no bash

0
#!/bin/bash
rm all
for f in assets/css/*.css;
do
  printf "<style type='text/css' >\n" >> all
  cat $f >> all
  printf "</style>\n <!-----$f---->" >> all
  echo "$f copied"
done

Estou usando este código para copiar todo o conteúdo css com os nomes dos arquivos em um arquivo html. Este código funciona bem.

Mas o modo como as strings são concatenadas é misturar os modelos e a lógica.

Isso pode ser escrito de forma mais elegante que tenha uma string de modelo como

<style type='text/css'>
${cssContent}
</style><!---${cssFileName}--->

e um array associativo como,

{
  'cssContent' : 'file content',
  'cssFileName' : 'file name'
}

e uma função como,

format(templateStr, assocArr)

que me retorna a string formatada?

    
por Madhavan Kumar 08.06.2015 / 10:52

1 resposta

1

O Bash aparentemente tem suporte à matriz de assosiative, mas eu não recomendo usá-lo porque não há uma maneira fácil de passá-lo para uma função como argumento. Em vez disso, esse script define os pares de chave / valor intercalados em uma matriz simples e os passa para format() como parâmetros ordinais.

#!/bin/bash

format() (
        T="$1"
        shift
        while test $# -ge 2; do
                eval "$1"'=$(echo "$2")'
                shift 2
        done
        eval "cat <<END_OF_TEMPLATE
$T
END_OF_TEMPLATE"
)

read -r -d '' templateStr <<'EOF'
<style type='text/css'>
${cssContent}
</style><!---${cssFileName}--->
EOF

assocArr=(
  cssFileName "abc.css"
  cssContent  $'.abc {\n  display: none;\n}\n'
)

format "$templateStr" "${assocArr[@]}"

Saída:

$ bash format.sh 
<style type='text/css'>
.abc {
  display: none;
}
</style><!---abc.css--->

Observe que $templateStr não pode conter a linha END_OF_TEMPLATE .

    
por 08.06.2015 / 13:30