bash 挂起处理变量的输出

Posted

技术标签:

【中文标题】bash 挂起处理变量的输出【英文标题】:bash hangs dealing with output of variable 【发布时间】:2017-10-05 08:55:17 【问题描述】:

我用 bash 编写了一个脚本,用于从传感器读取 XML 文件的值, 我的旧脚本就像一个魅力,但现在我需要通过参数为脚本提供服务器的 IP。

问题来了: 我的脚本只能工作到某个点,然后挂起,什么都不做(?)

脚本的使用方式如下:

./script.sh -temp 20 10 192.168.0.4

(-temp 用于读取温度值,20 表示低于它时发出警报,10 表示低于它时发出强烈警报,192.168.0.4 是 IP(它将在 combine_host( ) 到 -> http://192.168.0.4/details.xml))

我什至在一些调试步骤中添加了一些 echo 来输出每个需要的值。 它正好停在

    case "$1" in
        -temp)
        echo $host
                pre_testing=$(wget -O - -o /dev/null  $host | sed -n 's:.*    <Temperature Units="Centigrade">\(.*\)</Temperature>.*:\1:p')
        echo $pre_testing

所以 echo $host 正在工作并输出正确的地址,但 echo $pre_testing 永远不会运行,因为它挂在上面的函数中

我真的不知道为什么,只是测试了很多想法,比如将其输出到其他变量、反斜杠等。 但似乎没有任何效果

有人有想法吗?

是的,脚本正在运行,并且正在完成它的工作,所以我真的不想重写太多;)

这是我的德语 cmets 的完整源代码

#! /bin/bash

#Syntax:
#script.sh -x1 x2 x3 x4
#-x1 = Wert
#x2 = unter x Warnung
#x3 = unter x kritisch
#x4 = IP des Sensor-Servers
#folgende Werte sind abfragbar:
#-health
#-temp
#-humidity
#-baromb
#-light


#Adresse des WiFi-Sensor-Servers
http="http://"
pre_host=$4
details="/details.xml"
combine_host()  echo $http$pre_host$details; 
host="$( combine_host )"

echo $host

#Argumente abfragen und Daten laden
case "$1" in
        -health)
                testing=$(wget -O - -o /dev/null  $host | sed -n 's:.*    <Health>\(.*\)</Health>.*:\1:p')
            ;;
        -temp)
        echo $host
                pre_testing=$(wget -O - -o /dev/null  $host | sed -n 's:.*    <Temperature Units="Centigrade">\(.*\)</Temperature>.*:\1:p')
        echo $pre_testing
            testing=$(echo $pre_testing | sed -r "s/([^\.]*)\..*/\1/")
        echo $testing
            ;;
        -humidity)
                pre_testing=$(wget -O - -o /dev/null  $host | sed -n 's:.*<Humidity Units="PercentRelativeHumidity">\(.*\)</Humidity>.*:\1:p')
                testing=$(echo $pre_testing | sed -r "s/([^\.]*)\..*/\1/")
            ;;
        -baromb)
                pre_testing=$(wget -O - -o /dev/null  $host | sed -n 's:.*<BarometricPressureMb Units="Millibars">\(.*\)</BarometricPressureMb>.*:\1:p')
                testing=$(echo $pre_testing | sed -r "s/([^\.]*)\..*/\1/")
            ;;
        -light)
                testing=$(wget -O - -o /dev/null  $host | sed -n 's:.*<Light Units="Lux">\(.*\)</Light>.*:\1:p')
            ;;
        -*) echo "Falsches Argument!"
            ;;
    *) echo "kein Argument vorhanden!"
            ;;
esac


#Werte prüfen und ausgeben
if [ $# -ne "3" ];
        then
        status=3
        statustxt=UNKNOWN
        echo "Fehler in der Anfrage!"
        exit 3
elif [ "$testing" -gt "$3" ];
        then
        status=2
        statustxt=CRITICAL
        echo "$status - Sofort Handeln! - Wert_$1 $testing;$2;$3; $statustxt     | '$1'=$testing;$2;$3;;"
        exit 2
elif [ "$testing" -gt "$2" ];
        then
        status=1
        statustxt=WARNING
        echo "$status - Bald Handeln! - Wert_$1 $testing;$2;$3; $statustxt |     '$1'=$testing;$2;$3;;"
        exit 1
else
        status=0
        statustxt=OK
        echo "$status - Alles OK! - Wert_$1 $testing;$2;$3; $statustxt |     '$1'=$testing;$2;$3;;"
        exit 0
fi

done

【问题讨论】:

这很奇怪,因为在我更改 IP 之前它就像一个魅力 "-O" 正在写入文件,但 "-O -" 正在写入 stdout,而 "-o" 用于将日志输出写入其他地方,在我的情况下是 /dev/null 现在我只使用pre_testing=$(wget -O - -o - $host) echo $pre_testing,即使这不起作用 我必须将整个 XML 文件的输出存储到一个变量中,因为我在这个文件夹中没有写入权限 但是当你只做wget -O - -o - $host 时,你能看到屏幕上连续显示的数据吗?还是不? 【参考方案1】:

看不到问题... 也许你用错误的论点来称呼它? wget -O - -o /dev/null $host 的输出是什么?

PS: Grüsse aus der Schweiz :)

【讨论】:

是的,我的论点中有一个错字;) Grüße aus Norddeutschland ;)

以上是关于bash 挂起处理变量的输出的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串列分配给变量并在 Bash 脚本的输出中引用它

根据 SQL 输出设置 BASH 变量

bash - SQL查询输出到变量

将命令输出重定向到 bash 中的变量失败

将输出分配给Bash中的变量[重复]

Bash 脚本将命令输出存储到变量中