Advertisement
Guest User

3-2

a guest
Oct 1st, 2016
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.20 KB | None | 0 0
  1. #!/bin/sh
  2.  
  3. ARG_LOCATION=
  4. ARG_UNIT=1 #use 1 for F 0 for C
  5. ARG_ALL=1
  6. ARG_CURRENT=1
  7. ARG_FORECAST=0
  8. ARG_SUN=1
  9. ARG_DEFAULT_ALL=1
  10.  
  11. help(){
  12. echo "Usage: [-h] [-l locations] [-u unit] [-a|-c|-d days|-s]"
  13. echo "-h Print this page"
  14. echo "-l Set locations"
  15. echo "-u Set unit c or C or f or F"
  16. echo "-a Equal to -c -d5 -s"
  17. echo "-c Current Condition"
  18. echo "-d Set forecast days"
  19. echo "-s Print Sunrise/Sunset times"
  20. }
  21.  
  22.  
  23. readconfig(){
  24. if [ ! -f ~/.weather.conf ]; then
  25. return
  26. fi
  27. ARG_LOCATION=`cat ~/.weather.conf | grep -i 'location=' | tail -n 1 | awk '{ FS = "=" } ; {print $2}'`
  28. if [ $(cat ~/.weather.conf | grep -i 'unit=c') ]; then
  29. ARG_UNIT=0
  30. fi
  31. local temp=`cat ~/.weather.conf | grep -i 'display=all' | tail -n 1 | awk '{ FS = "=" } ; {print $2}'`
  32. if [ "$temp" != "" ];then
  33. ARG_CURRENT=0
  34. ARG_FORECAST=5
  35. ARG_SUN=0
  36. fi
  37. }
  38.  
  39. checkargs(){
  40. if [ ! $ARG_LOCATION ]; then
  41. >&2 echo "No location specified"
  42. exit 1
  43. fi
  44. if [ $ARG_ALL -eq 1 ] && [ $ARG_CURRENT -eq 1 ] && [ $ARG_FORECAST -eq 0 ] && [ $ARG_SUN -eq 1 ] ; then
  45. >&2 echo "Nothing to print"
  46. exit 1
  47. fi
  48. }
  49. getxml(){
  50. local queryhead="https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20"
  51. local querytail=")&format=xml&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"
  52. local query="text%3D%22"`echo -n $ARG_LOCATION | sed 's/,/%22%20or%20text%3D%22/'`"%22"
  53. local query="$queryhead$query$querytail"
  54. xml=`curl -sS "$query" | sed 's/yweather://'`
  55. }
  56. transtemp(){
  57. if [ $ARG_UNIT -eq 0 ];then
  58. local temp=`echo "($1-32)*5/9" | bc`
  59. local temp="$temp°C"
  60. echo -n $temp
  61. else
  62. local temp="$1°F"
  63. echo -n $temp
  64. fi
  65. }
  66. docurrent(){
  67. local xpath="/query/results/channel[$i]/item/condition/"
  68. local temp=`echo -n "$xml" |xmllint --xpath "${xpath}@temp" - | awk '{ FS = "\"" } ; { print $2 }'`
  69. local temp=`transtemp $temp`
  70. local weather=`echo -n "$xml" |xmllint --xpath "${xpath}@text" - | awk '{ FS = "\"" } ; { print $2 }'`
  71. echo "$loc, $weather, $temp"
  72. }
  73. doforecast(){
  74. for j in `seq 1 $ARG_FORECAST`; do
  75. local xpath="/query/results/channel[$i]/item/forecast[$j]/"
  76. local date=`echo -n "$xml" |xmllint --xpath "${xpath}@date" - | awk '{ FS = "\"" } ; { print $2 }'`
  77. local day=`echo -n "$xml" |xmllint --xpath "${xpath}@day" - | awk '{ FS = "\"" } ; { print $2 }'`
  78. local lowtemp=`echo -n "$xml" |xmllint --xpath "${xpath}@low" - | awk '{ FS = "\"" } ; { print $2 }'`
  79. local lowtemp=`transtemp $lowtemp`
  80. local hightemp=`echo -n "$xml" |xmllint --xpath "${xpath}@high" - | awk '{ FS = "\"" } ; { print $2 }'`
  81. local hightemp=`transtemp $hightemp`
  82. local weather=`echo -n "$xml" |xmllint --xpath "${xpath}@text" - | awk '{ FS = "\"" } ; { print $2 }'`
  83. echo "$date $day $lowtemp ~ $hightemp $weather"
  84. done
  85. }
  86. dosun(){
  87. local xpath="/query/results/channel[$i]/astronomy/"
  88. local sunrise=`echo -n "$xml" |xmllint --xpath "${xpath}@sunrise" - | awk '{ FS = "\"" } ; { print $2 }'`
  89. local sunset=`echo -n "$xml" |xmllint --xpath "${xpath}@sunset" - | awk '{ FS = "\"" } ; { print $2 }'`
  90. echo "sunrise $sunrise, sunset $sunset"
  91. }
  92. printweather(){
  93. ARG_LOCATION=`echo -n "$ARG_LOCATION" | tr ',' ' '`
  94. i=1
  95. for loc in ${ARG_LOCATION}
  96. do
  97. if [ $ARG_CURRENT -eq 0 ];then
  98. docurrent
  99. fi
  100. if [ $ARG_FORECAST -ne 0 ];then
  101. doforecast
  102. fi
  103. if [ $ARG_SUN -eq 0 ];then
  104. dosun
  105. fi
  106. i=`echo "$i + 1" | bc`
  107. done
  108.  
  109. }
  110. readconfig
  111. while getopts hl:u:acd:s var ; do
  112. case $var in
  113. \?)
  114. exit 1
  115. ;;
  116. h)
  117. help
  118. exit 0
  119. ;;
  120. l)
  121. ARG_LOCATION=$OPTARG
  122. ;;
  123. u)
  124. if [ $OPTARG = "c" ] || [ $OPTARG = "C" ]; then
  125. ARG_UNIT=0
  126. elif [ $OPTARG != "f" ] && [ $OPTARG != "F" ];then
  127. exit 1
  128. else
  129. ARG_UNIT=1
  130. fi
  131. ;;
  132. a)
  133. ARG_ALL=0
  134. ARG_CURRENT=0
  135. ARG_FORECAST=5
  136. ARG_SUN=0
  137. ;;
  138. c)
  139. if [ $ARG_ALL -eq 0 ]; then
  140. >&2 echo "Cannot use -a with -c -d -s at same time"
  141. exit 1
  142. fi
  143. ARG_CURRENT=0
  144. ;;
  145. d)
  146. if [ $ARG_ALL -eq 0 ]; then
  147. >&2 echo "Cannot use -a with -c -d -s at same time"
  148. exit 1
  149. fi
  150. if [ $OPTARG -lt 1 ] || [ $OPTARG -gt 5 ]; then
  151. >&2 echo "Forecast day number need to between 1 to 5"
  152. exit 1
  153. fi
  154. ARG_FORECAST=$OPTARG
  155. ;;
  156. s)
  157. if [ $ARG_ALL -eq 0 ]; then
  158. >&2 echo "Cannot use -a with -c -d -s at same time"
  159. exit 1
  160. fi
  161. ARG_SUN=0
  162. ;;
  163. esac
  164. done
  165.  
  166. checkargs
  167. getxml
  168. printweather
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement