linux - BASH - 基于变量创建和填充目录

标签 linux bash loops

我正在编写一个 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

如何基于变量创建目录,然后在循环内将文件保存到这些目录?

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

  1. 文件 pt2.lst 是使用 bash 脚本生成的。每行包含一个 4-5 位数字
  2. 我打算通过在循环中运行多个脚本来将多个文件保存到每个新创建的目录中;为了简单起见,我只包含了一个
  3. 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/

相关文章:

bash - set -- “$@” "$i"在 Bash 中是什么意思?

linux - EventSource 登录单声道

python + 运行带变量的系统命令

linux - 如何从另一个 shell 脚本运行 shell 脚本,从 CSV 文件中读取第一个 shell 脚本名称

linux - 将 awk 与列值条件一起使用

c++ - Char数据类型和while循环

bash - awk,从文件中提取特定值

android - 我如何摆脱错误(我的脚本有什么问题)

string - 在循环中对字符串使用 += 是不好的做法吗?

c++ - 优化包含 for 和 if 的 C++ 代码块