【问题标题】:copy paste code works but not as a script复制粘贴代码有效,但不能作为脚本
【发布时间】:2021-01-20 14:02:05
【问题描述】:

我编写了一个包含六个 if 语句的脚本,如下所示:

#!/usr/bin/bash
if [ -n $var1 ]
        then
            for f in /path/*.fastq.gz
            do
                x=${f/%.fastq.gz/_sample1-forward.fastq.gz}
                y=${f/%.fastq.gz/_sample1-forward.out}
                q=${f/%.fastq.gz/_temp.fastq.gz}
                command [options] -i $f -o $temp${x##*/} 
                cp $temp${x##*/} $temp${q##*/}
            done
        else
            echo "no $var1"
            for f in /path/*.fastq.gz
            do
                q=${f/%.fastq.gz/_temp.fastq.gz}
                cp $f $temp${q##*/}
            done
fi

其他五个语句对 var2 到 var6 执行类似的任务。当我运行脚本时,我得到了意外的输出(没有错误没有警告),但是当我将每个 if 语句复制粘贴到终端时,我最终得到了我期望的确切结果。几个小时以来,我一直在寻找隐藏的字符或语法问题。这可能是外壳问题吗?在 OSX 上编写的脚本(默认 zsh)并在服务器上执行(默认 bash)。我感觉这个issue 很相似,但我在回复中找不到我的问题的答案。

欢迎提出任何想法!

庭取

【问题讨论】:

  • 请先将您的脚本粘贴到shellcheck.net,然后尝试实施那里提出的建议。

标签: bash if-statement scripting


【解决方案1】:

你也许应该看看shebang。我认为正确的用法是#!/usr/bin/env bash#!/bin/bash

【讨论】:

    【解决方案2】:

    感谢您的帮助,非常感谢。 Shebang 似乎不是问题,尽管感谢您指出这一点。 Shellcheck.net 提醒我使用

    [[]]

    对于未引用的变量,但这也没有解决问题。以下是出了什么问题以及我是如何“修复”它的:

    对于每个变量,使用相同的命令(工具),它依赖于支持文件(格式相似但内容不同)。最初,在每个 if 语句之前,我将前一个变量的支持文件替换为当前变量所需的支持文件。由于某种原因(好奇为什么,欢迎任何想法),这并不总是正确发生。 作为一种快速解决方法,我制作了该工具的六个版本,所有版本都具有不同的支持文件,并在每个 if 语句之前使用 PYTHONPATH=/path/to/version/:$PYTHONPATH。最佳做法是调整该工具,以便它可以使用不同的支持文件或处理重复性任务的选项,但我目前没有时间。

    祝你有美好的一天, 庭取

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      相关资源
      最近更新 更多