【问题标题】:bash script maybe syntax error not sure trying a until loopbash脚本可能语法错误不确定尝试直到循环
【发布时间】:2017-06-05 18:40:01
【问题描述】:

大家好,我正在尝试为我的服务器编写一个 wol 脚本。树莓派每次启动时都会执行。

我猜这是一个语法错误,但我现在没有解决方案,所以我问你。 我在第 5 行遇到错误,但不知道如何纠正它。

#!/bin/bash

nas=[ping -c 1 192.192.168.222.5 &> /dev/null ]

until [ $nas = "1" ];do
python wol.py
sleep 2
nas=[ping -c 1 192.192.168.222.5 &> /dev/null ]
done

wol.py 是 marc balmar 发送 wol 包的脚本

#!/usr/bin/env python
#coding: utf8

# Wake-On-LAN
#
# Copyright (C) 2002 by Micro Systems Marc Balmer
# Written by Marc Balmer, marc@msys.ch, http://www.msys.ch/
# Modified by saarnu for nerdoskop.wordpress.com
# This code is free software under the GPL

import struct, socket, time, os

def WakeOnLan(ethernet_address):

  # Construct a six-byte hardware address

  addr_byte = ethernet_address.split(':')
  hw_addr = struct.pack('BBBBBB', int(addr_byte[0], 16),
    int(addr_byte[1], 16),
    int(addr_byte[2], 16),
    int(addr_byte[3], 16),
    int(addr_byte[4], 16),
    int(addr_byte[5], 16))

  # Build the Wake-On-LAN "Magic Packet"...

  msg = '\xff' * 6 + hw_addr * 16

  # ...and send it to the broadcast address using UDP
  time.sleep(5)
  s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
  s.sendto(msg, ('<broadcast>', 9))
  s.close()

WakeOnLan('C8:60:00:6D:CF:54') # MAC-Adresse der DiskStation

我在 powershell 中写了一个类似的代码,我试图复制它或将它翻译成 bash 要容易得多。

$NAS = test-connection -count 1 -quiet 192.168.222.5
if ($NAS -like "False"){
do
{
$Mac = "C8:60:00:6D:CF:54"
$MacByteArray = $Mac -split "[:-]" | ForEach-Object { [Byte] "0x$_"}
[Byte[]] $MagicPacket = (,0xFF * 6) + ($MacByteArray  * 16)
$UdpClient = New-Object System.Net.Sockets.UdpClient
$UdpClient.Connect(([System.Net.IPAddress]::Broadcast),7)
$UdpClient.Send($MagicPacket,$MagicPacket.Length)
$UdpClient.Close()
Start-Sleep -s 5
$NAS = test-connection -count 1 -quiet 192.168.222.5
}
until
(
$NAS -like "True"
)
}

【问题讨论】:

    标签: python bash powershell wake-on-lan


    【解决方案1】:

    首先,使用http://www.shellcheck.net 修复脚本中的语法问题。

    您的命令替换语法错误,通过该修复并直接在 until-loop 中使用退出代码 ping

    until ping -c 1 192.192.168.222.5 &> /dev/null
    do
        python wol.py
        sleep 2
    done
    

    应该可以解决您的问题。 pingman 页面说

    如果 ping 根本没有收到任何回复数据包,它将以代码 1 退出。如果同时指定了数据包计数和截止时间,并且在截止时间到达时收到的数据包少于计数,它也会以代码 1 退出代码 1。在其他错误时,它以代码 2 退出。否则,它以代码 0 退出。这使得可以使用退出代码来查看主机是否处于活动状态。

    【讨论】:

    • 如此简单,谢谢它现在可以使用并且代码更少
    • @SelimAkca:很高兴为您提供帮助!
    【解决方案2】:

    您的 bash 脚本中有几个错误,而不仅仅是一个。

    #!/bin/bash
    
    # This is a silent ping. The output is redirected to /dev/null. The only visible
    # change in user-land will be the exit code, available as $?.
    # The exit code "0" means success, the exit code "1" means some error.
    
    ping -c 1 192.192.168.222.5 &> /dev/null
    
    # You need double round parenthesis here to evaluate a comparison.
    # Also a comparison, as almost everywhere in programming, is "==" instead of "=".
    until (( $? == "0" ));
        do
        python wol.py
        sleep 2
        # There is the silent ping again. Updating $?.
        ping -c 1 192.192.168.222.5 &> /dev/null
    done
    

    退出代码见: Exit Shell Script Based on Process Exit Code

    对于不同的括号/方括号,请参阅man bashHow to use double or single brackets, parentheses, curly braceshttps://stackoverflow.com/a/9666169/7236811 的真正优秀的 bash 手册。

    【讨论】:

      猜你喜欢
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      相关资源
      最近更新 更多