我有一个bash测试数组,我想将其传递给MyShell,然后将相同的命令传递给bash,并验证输出。当前的脚本在项目的早期迭代中运行良好,并帮助我发现了许多错误。
然而,我的程序是有意的(这是作业,但bash脚本不是(
在新行上打印(True(或(False(。除此之外,输出是相同的。
你能帮我从变量outputMyShell中删除所有匹配"(True("或"(False("的行吗?
编辑:这里有3个例子。
输入:(echo 1&&echo 2(||(echo 3&&echo 4(
MyShell输出:"1
2">
Bash输出:"1
2">
测试通过
输入:test-e src/
MyShell输出:"(True(">
Bash输出:">
测试失败的
输入:test-f src/
MyShell输出:"(False(">
Bash输出:">
测试失败的
for ((i = 0; i < ${#INPUTS[@]}; i++))
do
echo -e "nInput: ${INPUTS[$i]}"
outputMyShell=$(./Myshell ${INPUTS[$i]})
eval $(rm -rf bashCreatedDirectory)
outputBash=$(eval ${INPUTS[$i]})
#echo -e "MyShell Output: "${outputMyShell}""
#echo -e "Bash Output: "${outputBash}""
if [ "${outputMyShell}" = "${outputBash}" ]
then
tput setaf 6;
echo -e "Test passed"
else
tput setaf 1;
echo -e "Test failed"
fi
tput sgr0;
done
在您的示例中,您所要做的似乎只是删除(True)
或(False)
的行。您可以使用sed
来做到这一点:
if [ "$(sed '/(True)|(False)/d' <<< "$a")" = "$b" ]; then
echo equal
else
echo different
fi
这将打印
对于a="1 2"
和b="1 2"
,equal
equal
用于a="(True)"
和b=""
equal
用于a="(False)"
和b=""
equal
用于a=$'(True)n1'
和b=$'1'
a=1
和b=2
的different
different
用于a=$'(True)n1'
和b=2
如果我能够正确地猜测你想要实现的目标,那么试试这个。
# We don't need to know the index; just loop over items
for input in "${INPUTS[@]}"; do
# Prefer printf over echo -e
printf "nInput: %sn" "$input"
# Run comparison command
if
# Don't use a useless variable
./Myshell $input |
# Remove (True) or (False)
grep -Exv '((True|False))' |
# compare
cmp - <(eval $input)
then
tput setaf 6
echo "Test passed"
else
tput setaf 1
echo "Test failed"
fi
tput sgr0
# No eval necessary here
rm -rf bashCreatedDirectory
done