我是一个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脚本执行的计算有关。我被告知,计算的性质并不重要,因为目的是让脚本运行。
第二段代码如下,相关行由Start
和Stop
条评论分隔。我可以告诉你的是:$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
答案 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
是应该表示文件路径的变量名,文件路径的内容重定向到命令(使用<
)。所有错误的输出(stderr
,2
)被重定向(>
)到标准输出(stdout
或&2
,&符表示此是文件描述符,而不是文件路径,否则会将输出重定向到名为2
的文件。
tee $output
tee
将stdin
输出到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
)