Substituir pela variável de loop em um padrão de string

3

Estou tentando fazer uma iteração de uma matriz de nomes de arquivos e substituo o nome do arquivo por um caminho absoluto. O código é,

#!/bin/bash
jsArray=(moment.js datatable.js jquery.js jquery.tmpl.js dt_jq_ui.js report_app.js)
for f in "/path/to/res/${jsArray[@]}.js";
do
  echo "$f"
done

Ele retorna,

/path/to/res/moment.js
datatable.js
jquery.js
jquery.tmpl.js
dt_jq_ui.js
report_app.js.js

Por que apenas o primeiro elemento é prefixado e somente o último elemento é sufixado?

Eu esperava entradas como

/path/to/res/moment.js
/path/to/res/datatable.js
..................
/path/to/res/report_app.js  
    
por Madhavan Kumar 08.06.2015 / 12:56

2 respostas

4

Porque você disse ao Bash:

~$ echo "/path/to/res/${jsArray[@]}.js"
/path/to/res/moment.js datatable.js jquery.js jquery.tmpl.js dt_jq_ui.js report_app.js.js

Você está apenas dando uma longa string. O que você quer fazer é algo como

~$ for f in "${jsArray[@]}.js"
     do echo "/path/to/res/$f"
   done
/path/to/res/moment.js
/path/to/res/datatable.js
/path/to/res/jquery.js
/path/to/res/jquery.tmpl.js
/path/to/res/dt_jq_ui.js
/path/to/res/report_app.js.js
    
por 08.06.2015 / 13:04
4

Porque é isso que você está dando o seu loop:

$ jsArray=(moment.js datatable.js jquery.js jquery.tmpl.js dt_jq_ui.js report_app.js)
$ echo "/path/to/res/${jsArray[@]}.js"
/path/to/res/moment.js datatable.js jquery.js jquery.tmpl.js dt_jq_ui.js report_app.js.js

Ou, para dar um exemplo mais simples:

$ arr=(a b c );
$ for f in "foo ${arr[@]} bar"; do echo "$f"; done
foo a
b
c bar

Você está dando uma string, uma matriz e outra string. Por que o shell anexaria a string a cada elemento? Estou imprimindo string , array , string , assim como você disse.

Se você quiser adicionar um prefixo e um sufixo a cada elemento, faça o seguinte:

$ for f in "${jsArray[@]}";
do
  echo "/path/to/res/$f.js"
done
/path/to/res/moment.js.js
/path/to/res/datatable.js.js
/path/to/res/jquery.js.js
/path/to/res/jquery.tmpl.js.js
/path/to/res/dt_jq_ui.js.js
/path/to/res/report_app.js.js
    
por 08.06.2015 / 13:04