这些Unix / Linux行做了什么?

时间:2016-08-11 15:43:42

标签: linux shell unix

我是一个Unix / Linux shell脚本新手,我被要求查看包含以下行的脚本。这个问题中的以下细节含糊不清,但编写此代码的人没有留下任何文档,并且已经被删除。谁能告诉他们实际做了什么?

有两个特定的代码段。第一个是简单的行source polys.sh,其中polys.sh是一个内容为

的文本文件
failure="020o 040a"
success="002[a-d] 003[a-r] 004[a-s] 005[a-u]

我认为,表示各种参数与shell脚本执行的计算有关。我被告知,计算的性质并不重要,因为目的是让脚本运行。

第二段代码如下,相关行由StartStop条评论分隔。我可以告诉你的是:$arg1为空,$opt1也是空白,$poly是文本文件的路径和名称,./search我认为是文件夹中。

if [ $search == "yes" ]
    then
      # Search stage for squares containing zeros
      #

      # Start.

      output="$outputs/search/"`basename $poly` 
      ./search $opt1 $arg1 < $poly 2>&1 | tee $output
      if tail -n1 $output | grep -v "success"

      # End.

      then
        echo "SEARCH FAILURE" >> $output
        continue
      fi
      # Save approximations
      #
      echo -n "SEARCH SUCCESS " >> $output
      cat /tmp/iters >> $output
      cp /tmp/zeros $inputs/search/`basename $poly`
    else
      echo "No search"
    fi

1 个答案:

答案 0 :(得分:1)

编辑 Charles Duffy先生建议的初步免责声明:

  

以下解释假设您不会遇到与扩展相关的错误;请根据shellcheck.net的建议更正您的代码,以确保这些说明正确

  • source polys.sh包含脚本polys.sh中的代码,该脚本是与其源文件位于同一文件夹中的文件(因此只是文件名,没有其路径)。
  • 在该文件中:

    failure="020o 040a"
    success="002[a-d] 003[a-r] 004[a-s] 005[a-u]"
    

    是两个变量声明;变量$failure设置为"020o 040a"$success设置为"002[a-d] 003[a-r] 004[a-s] 005[a-u]"。由于文件为source d,您的脚本中可以使用这两个变量(请echo "$failure"echo "$success"自行查看)。

  • output="$outputs/search/`basename $poly`"有两个部分需要解释:

    "$outputs/search/"
    

    将变量$output设置为"$outputs/search/",即变量$outputs的值,后跟字符串"/search/"。,

    `basename $poly`
    

    反引号中的任何内容都是命令替换,它解释并运行返回其输出的命令,命令basename $poly$poly获取基本文件或文件夹名称(如果它是文件路径)(例如,basename $poly poly="/dev/file.txt"收益file.txt);输出作为字符串附加。到"$outputs/search/"

  • ./search $opt1 $arg1 < $poly 2>&1 | tee $output是两个命令,由管道|分隔:

    ./search $opt1 $arg1 < $poly 2>&1
    

    使用两个参数./search./变量运行可执行文件$opt1$opt2是当前脚本目录的简写)。 $poly是应该表示文件路径的变量名,文件路径的内容重定向到命令(使用<)。所有错误的输出(stderr2)被重定向(>)到标准输出(stdout&2,&符表示此是文件描述符,而不是文件路径,否则会将输出重定向到名为2的文件。

    tee $output
    

teestdin输出到stdout并将参数作为文件路径输出。因此,tee "/home/nick/output"会将stdin保存到"/home/nick/output"的文件以及stdout

  • if tail -n1 $output | grep -v "success"

    tail -n1 $output
    

    获取文件的最后一行&#34; $ output&#34;变量值。

    grep -v "success"
    

    在一行中-v的{​​{1}}的最后一行中搜索任何不匹配(tail -n1反转匹配)(例如,如果最后一行是"success" },它将传递"fail"语句,因为它不包含if