在脚本中运行 bash

在脚本中运行 bash

我想创建一个脚本来运行另一个带有多个参数的脚本

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

我有这个错误:

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

请问有什么问题吗?

答案1

该行存在多个语法和引用问题

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

这是您问题中脚本的更清晰版本:

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

我不知道这些争论的目的是什么,createGnuploat.sh所以你必须自己检查一下。

答案2

如果您需要将命令存储在变量中,请不要使用字符串,那是行不通的。看Bash 常见问题解答 #50。使用函数或数组。

您的行被解析为赋值var="bash createGnuploat.sh "${exp[j]}" ../Result/ 0"后跟两个单词${arr[i]}(将被视为命令名称)和${exp[j]}(这将是命令的第一个也是唯一的参数)。检查问题或编辑器中的语法突出显示,它显示带引号的字符串内的内容。

始终在变量替换周围使用双引号,例如"$foo".否则,变量的值将被拆分为被解释为全局模式的单词。 (在 0.01% 的情况下,这是所需的行为,请省略双引号。)对于数组,使用"${foo[@]}"将数组的每个元素放在单独的单词中("${foo[*]}"是一个单词,数组的元素由空格分隔;如果省略引号,则每个元素都会被分解为单独的单词,这些单词被解释为全局模式)。

这是使用函数重写的代码片段:

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

对于使用数组变量而不是函数更有意义的极少数情况:

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

相关内容