从 Bash 中的变量中删除与"(True)"或"(False)"匹配的所有行?



我有一个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=1b=2different
  • 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

相关内容

  • 没有找到相关文章

最新更新