run bash in script

1

Eu quero criar um script para executar outro script com vários parâmetros

exp=([1]=bloc [2]=ins [3]=rep [4]=op)
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

E eu tenho esse erro:

run.sh: line 9: =bash createGnuploat.sh op ../Result/ 0: Aucun fichier ou dossier de ce type

Qual é o problema, por favor?

    
por user15992 17.09.2012 / 17:05

2 respostas

1

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
    
por 18.09.2012 / 03:17
2

Existem vários problemas de sintaxe e citação na linha

$var="bash createGnuploat.sh "${exp[j]}" ../Result/ 0" ${arr[i]} ${exp[j]}

Aqui está uma versão mais limpa do script em sua pergunta:

for j in bloc ins rep op; do
        for i in mem gen usr; do
                bash createGnuploat.sh "$j" ../Result/ 0 "$i" "$j"
        done
done

Eu não sei o que os argumentos devem ser para createGnuploat.sh , então você terá que verificar isso sozinho.

    
por 17.09.2012 / 17:14