我正在编写一个 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 内容的新目录。我认为这会起作用:
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
如何基于变量创建目录,然后在循环内将文件保存到这些目录?
以下是可能相关或不相关的详细信息列表:
- 文件 pt2.lst 是使用 bash 脚本生成的。每行包含一个 4-5 位数字
- 我打算通过在循环中运行多个脚本来将多个文件保存到每个新创建的目录中;为了简单起见,我只包含了一个
- BASH 脚本使用单个必需参数 $1 运行,该参数充当许多脚本命令的输入文件
最佳答案
删除赋值运算符周围的空格。也就是说,而不是这个:
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
的变量。这也意味着当您将第一个示例描述为“它有效”时,这肯定不是真的。
关于linux - BASH - 基于变量创建和填充目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34294733/