【问题标题】:Remove all lines matching "(True)" or "(False)" from a variable in Bash?从 Bash 的变量中删除所有匹配“(True)”或“(False)”的行?
【发布时间】:2018-12-11 11:21:48
【问题描述】:

我有一个要传递给 MyShell 的 bash 测试数组,然后将相同的命令传递给 bash,并验证输出。当前脚本在项目的早期迭代中运行良好,并帮助我发现了许多错误和错误。

但是,我的程序是故意的(这是功课,但 bash 脚本不是)
在新行上打印 (True) 或 (False)。除此之外,输出是相同的。

您能帮我使用(可能各一行)语法从变量 outputMyShell 中删除与“(True)”或“(False)”匹配的所有行吗?

编辑:这里有 3 个例子。

输入:(echo 1 && echo 2) || (回声 3 && 回声 4)
MyShell 输出:“1
2"
Bash 输出:“1
2"
测试通过

输入:test -e src/
MyShell 输出:“(真)”
Bash 输出:""
测试失败

输入:test -f src/
MyShell 输出:“(假)”
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

【问题讨论】:

  • 你能把你的问题简单概括一下吗?该脚本似乎与问题不太相关,并且缺少outputMyShell 的相关内容。如果我理解正确,您有两个变量并想比较它们但忽略(包含的行?)TrueFalse。如果您给出明确的示例说明何时应将两个字符串视为相同和不同,将会有所帮助。
  • 各种eval 行是怎么回事?你似乎把事情复杂了一个数量级。
  • 您尝试了哪个sed 命令,它是如何失败的?为什么无论如何都需要输出到变量中?
  • @Socowi 没错,一个变量存储我和我的伙伴正在编写的 shell 的输出,而另一个存储常规 Bash 的输出,给定相同的输入。它们应该是相同的,但对于 (True) 和 (False),所以我实际上并不关心我是编辑字符串还是比较它们,同时以某种方式忽略 (True) 和 (False) 行。
  • 您不需要eval 或命令替换来删除目录; rm -rf bashCreatedDirectory 就足够了。

标签: string bash shell


【解决方案1】:

鉴于您的示例,您似乎只需删除(True)(False) 的行。您可以使用sed 这样做:

if [ "$(sed '/(True)\|(False)/d' <<< "$a")" = "$b" ]; then
    echo equal
else
    echo different
fi

这将打印出来

  • equal 用于 a="1 2"b="1 2"
  • equal 代表 a="(True)"b=""
  • equal 代表 a="(False)"b=""
  • equal 代表 a=$'(True)\n1'b=$'1'
  • different 代表 a=1b=2
  • different 代表 a=$'(True)\n1'b=2

【讨论】:

  • 非常感谢! Bash 是一种令人困惑的语言,尤其是对于初学者而言。接受你的回答。
【解决方案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: %s\n" "$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

【讨论】:

  • 哇,这真的很整洁,我非常感谢您花时间清理它。它运行良好,现在看起来也不错。
  • 我进行了编辑以删除虚假分号和不必要的 echo -e 调用。我可能仍会将颜色代码移动到单独的功能中,以便更容易禁用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多