BASH – 根据variables创build和填充目录

我正在编写一个BASH脚本,它循环遍历列表文件pt2.lst的内容,运行一个Perl脚本并使用基于pt2.lst内容的文件名保存输出。 以下代码工作:

while read p; do perl Collect_Vaf.pl $1 $p > "$p_vaf.lst" done < pt2.lst 

…只是因为Perl脚本使用第二个命令行参数来命名打印到的文件。 运行上面的脚本“perl Collect_Vaf.pl $ 1 $ p”也可以在这种情况下工作。

我不想将文件保存在脚本运行的同一目录中,而是想根据pt2.lst的内容创build名称为新的目录。 我认为这将工作:

 while read p; do STR = "Sample_$p" mkdir $STR perl Collect_Vaf.pl $1 $p > "$STR/$p_vaf.lst" done < pt2.lst 

但是这给了我循环的每个迭代的以下三个错误消息:

 Vaf_Plotter.sh: line 11: STR: command not found usage: mkdir [-pv] [-m mode] directory ... Vaf_Plotter.sh: line 13: /.lst: Permission denied 

如何创build基于variables的目录,然后将文件保存到循环中的所有目录?

以下是可能相关或不相关的详细信息列表:

  1. 文件pt2.lst是用bash脚本生成的。 每行包含一个4-5位数字
  2. 我打算通过在循环中运行多个脚本来将多个文件保存到每个新创build的目录中; 为了简单,我只包含一个
  3. BASH脚本使用一个必需的参数$ 1来运行,它用作许多脚本命令的input文件

去除赋值运算符周围的空格。 那就是,而不是这个:

 STR = "Sample_$p" 

你必须这样写:

 STR="Sample_$p" 

另一个问题在这里:

 perl Collect_Vaf.pl $1 $p > "$STR/$p_vaf.lst" 

应该:

 perl Collect_Vaf.pl $1 $p > "$STR/${p}_vaf.lst" 

因为根据你的错误信息,没有名为$p_vaf变量。 这也意味着,当你描述你的第一个例子是“它的工作”,当然这是不正确的。