linux - 这些 Unix/Linux 行是做什么的?

标签 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

最佳答案

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

The below explanations assume you won't hit expansion-related bugs; please correct your code as advised by shellcheck.net to be assured that these explanations are correct

  • 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是应该表示文件路径的变量名,其中文件路径的内容已重定向到命令(使用 < )。所有错误的输出( stderr ,如 2 )被重定向( > )到标准输出( stdout ,或 &2 ,&符号表示这是一个文件描述符,而不是文件路径,否则它会将输出重定向到名为 2 的文件。

    tee $output
    

tee管道输出 stdinstdout并将参数作为文件路径。所以tee "/home/nick/output"会保存 stdin"/home/nick/output" 处的文件,以及 stdout .

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

    tail -n1 $output
    

    在“$output”变量的值处获取文件的最后一行。

    grep -v "success"
    

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

关于linux - 这些 Unix/Linux 行是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38900862/

相关文章:

linux - 几个堆栈操作(弹出+推送)与哈希表替代方案

数据库? Plesk Ec2 aws 错误 100% full xvda1

C 中的字符数组

linux - 我想用 sed 编辑器更改文本

linux - Linux 上的 netcat 代理 shell 问题

bash - 使用 head 和 tail 命令显示选定的行

c - 大型 Unix C 应用程序中 fork 进程的持续时间和范围

linux - 创建新文件时如何编写数据库触发器?

linux - 编写一个 bash shell 脚本,在用户定义的时间内消耗恒定数量的 RAM

unix - 从 ksh 获取包含环境变量的文件