【问题标题】:BASH - create and populate directories based on variableBASH - 根据变量创建和填充目录
【发布时间】:2015-12-15 16:42:10
【问题描述】:

我正在编写一个 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"; _ 是一个有效的标识符字符,$p_vaf 不是变量,请使用 ${p}_vaf$p\_vaf"$p"_vaf 或其他。

标签: linux bash loops


【解决方案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 的变量。这也意味着,当您将第一个示例描述为“它有效”时,这肯定不是真的。

【讨论】:

  • 感谢您的帮助。定义变量时我没有意识到空格数。但是,我向您保证,我发布的第一段代码肯定是有效的。它为 pt2.lst 中的每一行生成一个文件,其中包含 Perl 脚本的输出。我不确定为什么它对我有用,因为你的观点很好,$p_vaf 不是一个定义的变量;但它绝对有效。我将在我的问题中包含版本信息,以防它有助于阐明这种奇怪情况
  • 我刚刚想通了:我的第一个示例工作的原因是因为 Perl 脚本写入了一个基于第二个命令行参数 $p 命名的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 2016-02-19
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多