Se você precisar armazenar um comando em uma variável, não use uma string que simplesmente não funcione. Veja Bash FAQ # 50 . Use uma função ou um array.
Sua linha é analisada como a atribuição var="bash createGnuploat.sh "${exp[j]}" ../Result/ 0"
seguida pelas duas palavras ${arr[i]}
(que serão consideradas como um nome de comando) e ${exp[j]}
(que será o primeiro e único argumento para o comando). Verifique o destaque da sintaxe em sua pergunta ou em seu editor, ele mostra o que está dentro da string citada.
Sempre use aspas duplas em torno das substituições de variáveis, por exemplo %código%. Caso contrário, o valor da variável é dividido em palavras interpretadas como padrões glob. (Omita as aspas duplas em 0,01% dos casos em que esse é o comportamento desejado.) Para uma matriz, use "$foo"
para ter cada elemento da matriz em uma palavra separada ( "${foo[@]}"
é uma única palavra com os elementos de a matriz é separada por espaços; se você deixar de fora as aspas, cada elemento será dividido em palavras separadas que são interpretadas como padrões glob).
Aqui está o seu fragmento reescrito usando uma função:
create_plot () {
bash createGnuploat.sh "${exp[$2]}" ../Result/ 0 "${arr[$1]}" "${exp[$2]}"
}
for j in "${!exp[@]}"
do
arr=([1]=mem [2]=gen [3]=usr)
for i in "${!arr[@]}"
do
create_plot "$i" "$j"
done
done
Para os casos raros em que faz sentido usar uma variável de matriz em vez de uma função:
for j in "${!exp[@]}"
do
arr=([1]=mem [2]=gen [3]=usr)
for i in "${!arr[@]}"
do
var=(bash createGnuploat.sh "${exp[j]}" ../Result/ 0 "${arr[i]}" "${exp[j]}")
"${var[@]}"
done
done