布尔检查未按预期运行,bash/python

Boolean check not behaving as expected, bash/python

在使用 $grep 检查 $date 时,我得到了意外的结果。我正在使用 python 和 os 模块来检查 bash 命令的输出。

if not

有效,创建了 1 个当前日期的文件。

if

不起作用,为除当天以外的所有天创建文件。

我希望如果 $date 包含我正在寻找的字符串,它只会为那天创建一个文件,但是会出现 opposite。这是函数:

def write(self):
    
    #Formatting saved message
    msg = input("Enter a message: ")
    current_time = datetime.now().strftime("%m/%d/%Y | %H:%M")
    x = '\n{0} - {1}\n'.format(current_time, msg)

    try:

        #Checking string contained in $date output
        options = (
            'Mon',
            'Tue',
            'Wed',
            'Thu',
            'Fri',
            'Sat',
            'Sun'
            )
        
        for option in options:
            
            #Here is the "if not" in question.

            if not os.system(f'date | grep -q {option}'):
                y = option

                os.system('var=~/reminder_notes\n'
                         f'if [ -e $var ]; then echo "Writing to directory: ~/reminder_notes."\n'
                        
                          'else\n'
                            'mkdir $var && echo "Created directory: $var"\n'
                          'fi'
                        )
                os.system(f'echo "{x}" >> ~/reminder_notes/{y}.txt')

        print('\nMessage has been recorded.\n')

    except:
        print('\nAn error occured.')

在sh/bash中,退出状态0为成功(真),1+为失败(假)。

在Python中,整数0为假,1+为真。

由于两者对整数真实性的解释相反,所以检查相反。

这是不同语言如何对待成功的一个很好的例子。

date | grep -q {option} returns 0 如果 grep 命令成功,因为 Bash(和 Linux 作为一个整体,和 Windows)将退出代码0 为成功,除 0 以外的为某种失败。但是,在 Python 中,0 被认为等同于 False(0 以外的任何值都被认为等同于 True)。这就是为什么,如果你要求 Python 考虑 Bash 命令的真实性,它会在命令成功时说“它是 0,因此是 False”,而会说“它不是 0,并且因此 True" 如果命令失败。

HTH!