bash 挂起处理变量的输出
bash hangs dealing with output of variable
我在 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))
我什至在一些调试步骤中添加了一些回显来输出每个需要的值。
它就停在
case "" in
-temp)
echo $host
pre_testing=$(wget -O - -o /dev/null $host | sed -n 's:.* <Temperature Units="Centigrade">\(.*\)</Temperature>.*::p')
echo $pre_testing
所以 echo $host 正在工作并输出正确的地址但是 echo $pre_testing 永远不会 运行 因为它挂在上面的函数中
我真的不知道为什么,只是测试了很多想法,比如将它输出到另一个变量、反斜杠等。
但似乎没有任何效果
有人有想法吗?
是的,脚本正在运行并且正在完成它的工作,所以我真的不想重写太多 ;)
这是包含我的德语注释的完整源代码
#! /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=
details="/details.xml"
combine_host() { echo $http$pre_host$details; }
host="$( combine_host )"
echo $host
#Argumente abfragen und Daten laden
case "" in
-health)
testing=$(wget -O - -o /dev/null $host | sed -n 's:.* <Health>\(.*\)</Health>.*::p')
;;
-temp)
echo $host
pre_testing=$(wget -O - -o /dev/null $host | sed -n 's:.* <Temperature Units="Centigrade">\(.*\)</Temperature>.*::p')
echo $pre_testing
testing=$(echo $pre_testing | sed -r "s/([^\.]*)\..*//")
echo $testing
;;
-humidity)
pre_testing=$(wget -O - -o /dev/null $host | sed -n 's:.*<Humidity Units="PercentRelativeHumidity">\(.*\)</Humidity>.*::p')
testing=$(echo $pre_testing | sed -r "s/([^\.]*)\..*//")
;;
-baromb)
pre_testing=$(wget -O - -o /dev/null $host | sed -n 's:.*<BarometricPressureMb Units="Millibars">\(.*\)</BarometricPressureMb>.*::p')
testing=$(echo $pre_testing | sed -r "s/([^\.]*)\..*//")
;;
-light)
testing=$(wget -O - -o /dev/null $host | sed -n 's:.*<Light Units="Lux">\(.*\)</Light>.*::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 "" ];
then
status=2
statustxt=CRITICAL
echo "$status - Sofort Handeln! - Wert_ $testing;;; $statustxt | ''=$testing;;;;"
exit 2
elif [ "$testing" -gt "" ];
then
status=1
statustxt=WARNING
echo "$status - Bald Handeln! - Wert_ $testing;;; $statustxt | ''=$testing;;;;"
exit 1
else
status=0
statustxt=OK
echo "$status - Alles OK! - Wert_ $testing;;; $statustxt | ''=$testing;;;;"
exit 0
fi
done
看不出问题...
也许你用错误的参数调用它?
wget -O - -o /dev/null $host
的输出是什么?
PS: Grüsse aus der Schweiz :)
我在 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))
我什至在一些调试步骤中添加了一些回显来输出每个需要的值。 它就停在
case "" in
-temp)
echo $host
pre_testing=$(wget -O - -o /dev/null $host | sed -n 's:.* <Temperature Units="Centigrade">\(.*\)</Temperature>.*::p')
echo $pre_testing
所以 echo $host 正在工作并输出正确的地址但是 echo $pre_testing 永远不会 运行 因为它挂在上面的函数中
我真的不知道为什么,只是测试了很多想法,比如将它输出到另一个变量、反斜杠等。 但似乎没有任何效果
有人有想法吗?
是的,脚本正在运行并且正在完成它的工作,所以我真的不想重写太多 ;)
这是包含我的德语注释的完整源代码
#! /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=
details="/details.xml"
combine_host() { echo $http$pre_host$details; }
host="$( combine_host )"
echo $host
#Argumente abfragen und Daten laden
case "" in
-health)
testing=$(wget -O - -o /dev/null $host | sed -n 's:.* <Health>\(.*\)</Health>.*::p')
;;
-temp)
echo $host
pre_testing=$(wget -O - -o /dev/null $host | sed -n 's:.* <Temperature Units="Centigrade">\(.*\)</Temperature>.*::p')
echo $pre_testing
testing=$(echo $pre_testing | sed -r "s/([^\.]*)\..*//")
echo $testing
;;
-humidity)
pre_testing=$(wget -O - -o /dev/null $host | sed -n 's:.*<Humidity Units="PercentRelativeHumidity">\(.*\)</Humidity>.*::p')
testing=$(echo $pre_testing | sed -r "s/([^\.]*)\..*//")
;;
-baromb)
pre_testing=$(wget -O - -o /dev/null $host | sed -n 's:.*<BarometricPressureMb Units="Millibars">\(.*\)</BarometricPressureMb>.*::p')
testing=$(echo $pre_testing | sed -r "s/([^\.]*)\..*//")
;;
-light)
testing=$(wget -O - -o /dev/null $host | sed -n 's:.*<Light Units="Lux">\(.*\)</Light>.*::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 "" ];
then
status=2
statustxt=CRITICAL
echo "$status - Sofort Handeln! - Wert_ $testing;;; $statustxt | ''=$testing;;;;"
exit 2
elif [ "$testing" -gt "" ];
then
status=1
statustxt=WARNING
echo "$status - Bald Handeln! - Wert_ $testing;;; $statustxt | ''=$testing;;;;"
exit 1
else
status=0
statustxt=OK
echo "$status - Alles OK! - Wert_ $testing;;; $statustxt | ''=$testing;;;;"
exit 0
fi
done
看不出问题...
也许你用错误的参数调用它?
wget -O - -o /dev/null $host
的输出是什么?
PS: Grüsse aus der Schweiz :)