【问题标题】:Avoiding: syntax error near unexpected token in bash避免:bash 中意外标记附近的语法错误
【发布时间】:2016-02-21 07:29:35
【问题描述】:

我有一个像这样调用 python 脚本的 shell...

外壳代码:

#!/bin/sh
python PyTest.py

print("FE FI FO FUM I'M GOING TO MAKE IT TUMBLE TUM TUM")

5 + 4

print("No semicolons here!")

Python 代码:

#This is my test Python script running from bash

print("FE FI FO FUM I'M GOING TO MAKE IT TUMBLE TUM TUM")

print(5 + 4)

print("No semicolons here!")

这是输出。

74-85-81-234:Desktop Cody$ ./PyTest.sh
FE FI FO FUM I'M GOING TO MAKE IT TUMBLE TUM TUM
9
No semicolons here!
./PyTest.sh: line 5: syntax error near unexpected token `"FE FI FO FUM I'M GOING TO MAKE IT TUMBLE TUM TUM"'
./PyTest.sh: line 5: `print("FE FI FO FUM I'M GOING TO MAKE IT TUMBLE TUM TUM")'

我查看了“意外标记附近的语法错误”错误,看起来这是意料之中的。有没有更好的方法来做到这一点,有没有办法以这种方式调用函数而不会出现 Bash 错误?

提前致谢。

【问题讨论】:

  • 如果你想写python,那就这样做并使用python解释器。如果要编写 shell 脚本,请使用 shell。不要指望 shell 理解 python 或 python 理解 shell 脚本。
  • 为什么你的“shell脚本”Python的大部分文本?
  • 您希望5 + 4 做什么?没有赋值,没有echo 语句,这不是 sh 中算术的正确语法。支持print 的 Korn shell 和 zsh,但它不是 POSIX 恭维,也不需要括号。您的 cmets 说您正在使用 bash,但您在脚本中指定了 /bin/sh(可能链接到 bash,但不表现为 bash)。
  • 你想要完成什么?直接的问题是在 shell 脚本中没有以这种方式使用括号(它们在子 shell 中运行命令;因此括号内的第一个标记应该是命令名称 - 但在这里,问题是使用不正确的括号或有用)。
  • ... 但修复它会立即让您遇到print 的麻烦,这不是标准命令(因此“找不到命令”或可能执行您想要的其他操作的命令,可能涉及打印机并需要文件名,或者只是在另一栋楼的上锁房间里浪费一令纸),而且还不止于此。

标签: python bash shell


【解决方案1】:

如果您想运行bash 脚本,请在文件顶部指定bash,而不是sh

#!/bin/bash

要从 bash 运行 python 脚本,您所要做的就是:

python PyTest.py

如果您想在脚本中嵌入 python,那么您可以使用此处的文档:

python << END

print("FE FI FO FUM I'M GOING TO MAKE IT TUMBLE TUM TUM")

print(5 + 4)

print("No semicolons here!")

END

或者用bash写:

#!/bin/bash

echo "FE FI FO FUM I'M GOING TO MAKE IT TUMBLE TUM TUM"

echo $((5 + 4))

echo "No semicolons here either!"

但是为什么呢? Bash 不能做 python 不能做的任何事情,但是 python 可以做的比 bash 多得多。用python写一切!只需将 #!/usr/bin/env python 之类的内容放在 python 脚本的顶部即可。

【讨论】:

    【解决方案2】:

    您可以使用以下之一:

    #!/usr/bin/env python
    
    print("FE FI FO FUM I'M GOING TO MAKE IT TUMBLE TUM TUM")
    5 + 4
    print("No semicolons here!")
    

    #!/bin/sh
    
    python <<%
    print("FE FI FO FUM I'M GOING TO MAKE IT TUMBLE TUM TUM")
    5 + 4
    print("No semicolons here!")
    %
    

    请注意,5 + 4 在任何一种情况下都不会产生任何输出,因为这不是交互式 python 会话:

    FE FI FO FUM I'M GOING TO MAKE IT TUMBLE TUM TUM
    No semicolons here!
    

    使用-i 选项将使其工作:

    #!/bin/sh
    
    python -i <<%
    print("FE FI FO FUM I'M GOING TO MAKE IT TUMBLE TUM TUM")
    5 + 4
    print("No semicolons here!")
    %
    

    输出:

    [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> FE FI FO FUM I'M GOING TO MAKE IT TUMBLE TUM TUM
    >>> 9
    >>> No semicolons here!
    >>> 
    

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 2018-12-18
      • 2014-01-20
      • 2015-12-11
      • 2021-07-29
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多