我是 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
最佳答案
编辑 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
管道输出 stdin
至 stdout
并将参数作为文件路径。所以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/