【问题标题】:Using backticks in bash script, to call python script into variable had previously worked, but is broken now在 bash 脚本中使用反引号将 python 脚本调用到变量中以前可以工作,但现在已损坏
【发布时间】:2018-10-22 00:45:25
【问题描述】:

我有一个为游戏编写的简单脚本。该脚本是从游戏用户主目录中的 ~/.profile 调用的,它应该模拟一个假登录,该登录在成功比较两个变量后运行另一个脚本。它工作了一会儿,然后突然停止工作。 (编辑:当我的意思是它停止工作时,我并不是说我改变了一些东西并且它把一切都搞砸了,我的意思是它在一个晚上没有碰它之后就停止了工作。)

#!/bin/bash

pause(){
  read -p "Place [CARD] on scanner and press [ENTER] key..."
}

init(){
        cat /etc/issue
        pause
        READ=`sudo ~/bin/Read.py`
        CARD=`cat ~/var/keycode.txt`
        if [ "$READ" == "$CARD" ]; then
                ~/bin/mmenu.sh
        else
                echo "Incorrect... Please try again"
        fi
}

while true
do
        init
done

我做错了什么? 提前致谢。

编辑: Read.py的输出是12345,cat keycode.txt的输出是12345 然而,它似乎无法让它们正确比较。

脚本已被简化,Read.py 不打印,只是将其内容写入一个名为 rcard.txt 的文件,两个变量都像这样:

CARD=`cat ~/var/kcard.txt`
READ=`cat ~/var/rcard.txt`

尽我所能,即使使用 [ "$READ" == "$CARD" ],它仍然无法通过 if 语句。即使内容完全相同。 我真的不明白。

【问题讨论】:

    标签: python bash backticks


    【解决方案1】:

    这里有几个可能的错误来源,这取决于您的错误消息是什么(如果您甚至收到错误消息)。 sudo ~/bin/Read.py 可能会返回一个以上的文本,以空格分隔,这会导致如下错误:

    $ foo=hello world
    $ bash: world: command not found
    

    cat ~/var/keycode.txt 也可能出现同样的错误。为了避免这种潜在的错误,即使这不是您收到的错误,我也会将您的反引号用引号括起来,如下所示:

        READ="`sudo ~/bin/Read.py`"
        CARD="`cat ~/var/keycode.txt`"
    

    如果您没有收到任何错误消息,但当您输入正确的内容时代码无法正常工作,我会检查文件 ~/bin/Read.py~/var/keycode.txt 并查看您是否可以在那里发现您的问题 - 不一致可能发生在两者之一中导致未捕获的错误。

    如果您能就您的程序如何“突然停止工作”提供更多说明,那将很有用。

    【讨论】:

    • 作业的右侧不需要引号,因为不会进行分词。如果您直接分配带有空格的字符串,它只需要引号,但如果空格在反引号内,则不需要引号。这没有问题:var=`echo one two`; echo "$var".
    • 感谢您的回复。没有错误,实际上,Read.py 没有输出。它循环遍历 else 语句。运行 Read.py 不会返回任何错误。话虽如此,我认为你是对的。我会很快尝试一些东西,我会回来的。
    • 所以是的,Read.py 打印两行文本,一行用于卡的 UUID,另一行用于写入卡的字符串。和 keycode.txt 现在反映了这一点,两个反引号都用引号引起来。但是,它仍然循环遍历 else 语句。您还有其他想法还是我应该使用 sed 将其缩减为一行?
    • 鉴于您所掌握的信息,我对正在发生的事情一无所知。我会尝试使用sed 将其缩减为一行,然后看看会发生什么......对不起,我没有任何其他想法。 :(
    【解决方案2】:

    我觉得else语句里还是循环的,因为有好几行要比较,这样就不行了。另外,你的作业可以一次加入一些行。

    你可以这样替换你的 if 语句:

    if [ $( sudo ~/bin/Read.py |grep -wc "$CARD" ) -ge 1 ]; then
    

    这个带有 -c 选项的 grep 指令将返回 "$CARD" 中的行数,计算您的 Read.py 执行返回的行数。因此,如果至少有一行匹配,您将在 then 语句中按您的意愿循环。

    【讨论】:

    • 感谢您的回复和想法。但是,我在问题的末尾添加了一个编辑;我将输出缩小到只有一行,并尝试通过一个文件来绕过 .py 脚本的执行。但是,似乎认为这两个文件不匹配,即使其中一个只是另一个的副本。我开始怀疑它是位置问题还是 bash 的其他问题。它可能仍然是英国而不是美国
    • 我认为您不能像这样在多行文件上使用 == 运算符。我要试试。无论如何,对于可持续系统,我建议像我向您展示的那样使用 grep
    • 嗯,我只是尝试了一个小脚本,它运行良好,即使有多行:#!/bin/bash CARD=cat /tmp/readpy READ=cat /tmp/readpy if [[ "$READ " == "$卡" ]];然后 echo "matching" else echo "KO" fi 你的 GNU/Bash 版本是什么?
    • 您可以尝试使用与 CARD 完全相同的指令设置 READ 吗?另外,您能否给出以下输出:diff ~/var/kcard.txt ~/var/rcard.txt
    • 对不起,我离开了几天。我会试试的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2013-01-19
    • 2020-12-13
    • 2020-10-02
    • 2021-11-04
    相关资源
    最近更新 更多