我想创建一个脚本来运行另一个带有多个参数的脚本
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