Предполагая, что файловые системы и точки монтирования не содержат пробелов, попробуйте:
df -hP | awk 'NR>1 { $1=$6="" ; print }' | column -t
df -hP
выводит статистику файловой системы без разрывов строк для длинных имен файловых систем.
awk 'NR> 1 {...}'
ограничивает данное действие 2-й и последующими строками, чтобы пропустить строку заголовка df
...
awk
-действие {$ 1 = $ 6 = ""; print}
обнуляет ненужные поля и печатает остальные.
Использование {print $ 2, $ 3, $ 4, $ 5}
сделает то же самое.
column -t
упорядочивает весь вывод как чистую таблицу.
$ cat x
#!/bin/sh
echo '<testing inside a script>'
df -hP | awk 'NR>1 { $1=$6="" ; print }' | column -t
echo '</testing inside a script>'
$ chmod +x x
$ ./x
<testing inside a script>
71G 39G 29G 58%
1006M 0 1006M 0%
10M 208K 9,8M 3%
1006M 0 1006M 0%
</testing inside a script>
$ _
(Я удалю это снова, когда проблема, упомянутая в комментариях, будет решена ...)
#!/bin/bash
#again you must use bash...
valid[0]=160650648 ; valid[1]=163686025
valid[2]=120806542 ; valid[3]=37206841
i=0
while sleep 5; do
scan=$(./RFSniffer)
if [ "$scan" == "$oldscan" ]; then
i=$((i+1))
#if i is minor than 10 restart loop...
#So a alert will not be displayed again after 50 seconds...
if [ "$i" -lt "10" ]; then
continue
else
i=0
fi
fi
case $scan in
${valid[0]})
echo "Good Read"
echo "Your code is " $scan
./buzzer.sh &
omxplayer -o local sleighbells.mp3
curl -u "code": https://api.pushbullet.com/v2/pushes -d type=note -d title="Alert" -d body="DoorBell" &
;;
${valid[1]})
curl -u "code": https://api.pushbullet.com/v2/pushes -d type=note -d title="Alert" -d body="front sensor" &
;;
${valid[2]})
curl -u "code": https://api.pushbullet.com/v2/pushes -d type=note -d title="Alert" -d body="Back door sensor" &
;;
${valid[3]})
curl -u "code": https://api.pushbullet.com/v2/pushes -d type=note -d title="Alert" -d body="Second sensor" &
;;
*)
echo "BAD READ: your code and the valid don't match"
echo "Your correct valid code should be " $scan
;;
esac
oldscan=$scan
scan=''
#sleep 5 not needed sleep 5 is in while condition
done
РЕДАКТИРОВАТЬ :см. комментарии..
Правильно ли я перефразирую «Сценарий должен независимо доставлять прочитанные сканирования, но блокировать каждое сканирование после его появления в течение одной минуты»?
В вашем сценарии есть некоторые возможности для упрощения/оптимизации, и я предполагаю, что вы используете отредактированный тегbash
(hoppla -bash
...? )несмотря на шебанг, указывающий на другое... Таким образом, реализуя одноминутную паузу для отдельных сканирований, я попытался также воспользоваться возможностями, (используя echo
для команд, не установленных в моей системе -удалить, если доволен работой ). Попробуйте это и не стесняйтесь адаптировать:
VALID=(160650648 163686025 120806542 37206841) # define valid scans
BODY=(DoorBell "front sensor" "Back door sensor" "Second sensor") # define body tests
while true
do scan=$(./RFSniffer)
for IX in "${!VALID[@]}" "${#VALID[@]}" # 0 - 3 elements, and 4 to identify bad reads
do if [ "${scan:-FALSE}" = "${VALID[IX]}" ] # compare 4 elements, the 5. tries to compare to "" empty
then echo "Good Read"
echo "Your code is " $scan
if (( $SECONDS > ${LAST[IX]} + 60 )) # test for one minute pause
then if [ "$IX" = 0 ] # do this just for the "door bell"
then echo./buzzer.sh
echo omxplayer -o local sleighbells.mp3
fi
echo curl -u "code": https://api.pushbullet.com/v2/pushes -d type=note -d title="Alert" -d body="${BODY[IX]}" # &
LAST[IX]=$SECONDS # keep last scan occurrence
else echo "pausing "
fi
break # if good read - break out of the for loop to avoid the bad read msg
fi
if [ "$IX" = "${#VALID[@]}" ] # the fifth loop means no valid scan found
then echo "BAD READ: your code $scan and the valid ones don't match"
echo "Your correct valid code should be one of ${VALID[@]}"
fi
done
sleep 5
done