【问题标题】:/bin/sh: 1: [: missing ]/bin/sh: 1: [: 缺失]
【发布时间】:2019-07-24 14:46:29
【问题描述】:

我正在制作一个 python 脚本,它会自动检查计算机上是否安装了 nmap,然后继续运行 nmap。我遇到的一个问题是,当它运行时它会返回/bin/sh: 1: [: missing ],我还想知道如何将终端的输出通过管道传输回我的程序。假设我运行hostname -I 如何复制输出并在我的脚本中为其分配一个变量名。感谢代码在下面

import os
import subprocess
def isInstalled(name):
    cmd = """ if ! [ -x "$#(command -v """ + name + """)" ]; then
      echo '0'
      exit 0
    fi"""
    ret = subprocess.check_output(cmd, shell=True).strip()
    if ret == b'0':
        return False
    return True

if isInstalled('nmap'):
print("Nmap is installed")

else:
    print("nmap is uninstalled since quite mode is active auto install will")

【问题讨论】:

  • 这不是linux问题,而是shell问题:请调整标签。
  • 你的代码真的不应该给出这个错误。但是,只要稍加修改,它就会:如果你写[ -x "$#(command -v """ + name + """)"]; then)"] 之间没有空格)那么它会给出这个错误。您能否将此问题中的代码复制粘贴到一个新文件中并仔细检查?

标签: python linux


【解决方案1】:

看起来您的默认 shell 是 sh,没有可用的 test utility,因此请尝试在要组合的脚本中指定 bash shebang #!/bin/bash

def isInstalled(name):
    cmd = """#!/bin/bash
    if ! [ -x "$#(command -v """ + name + """)" ]; then
      echo '0'
      exit 0
    fi"""
    ret = subprocess.check_output(cmd, shell=True).strip()
    if ret == b'0':
        return False
    return True

或者你可以在 bash 中使用 double brackets 作为 if-else 语句:

if [[ some expression ]]
then
    some code
fi

【讨论】:

  • 在 return True 下我会放“if isInstalled('nmap'):” 对吗?
  • 很高兴这被接受了,但是在这种情况下添加 shebang 并不重要,并且不会使脚本与 Bash 一起运行。我怀疑 OP 只是重新格式化了代码以使其更适合发布,并无意中在 ] 之前插入了一个缺失的空格,从而修复了原始错误
【解决方案2】:

你的缩进和print和else之间的空行有问题。

考虑到这一点:

制表符被替换为(从左到右)一到八个空格,例如 字符的总数达到并包括 替换是八的倍数(这应该是相同的 Unix 使用的规则)。第一个之前的空格总数 非空白字符然后确定行的缩进。 缩进不能使用多条物理线分割 反斜杠;直到第一个反斜杠的空格确定 缩进。

将您的代码更改为:

if isInstalled('nmap'):
    print("Nmap is installed")
else:
    print("nmap is uninstalled since quite mode is active auto install will")

关于你的第二个问题,看看这个答案:https://stackoverflow.com/a/6657718/3589567

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 2015-12-02
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2020-11-23
    • 2021-03-26
    相关资源
    最近更新 更多