Лапки запобігають "розбиткові слова". Тобто: розбиття змінних на кілька елементів у символах пробілу (або якщо бути точнішим, на пробіли, вкладки та нові рядки, як визначено у значенні $IFSзмінної оболонки за замовчуванням ).
Наприклад,
$ var="one two"
$ howmany(){ echo $#; }
$ howmany $var
2
$ howmany "$var"
1
Тут ми визначаємо howmanyфункцію, яка просто дає нам знати, скільки позиційних параметрів задано. Як бачите, до змінної передаються два елементи, і з лапок текст у змінній трактується як одна одиниця.
Це важливо для точного передачі інформації. Наприклад, якщо змінна містить шлях до файлу, а ім'я файлу містить пробіли в будь-якому місці шляху, команда, яку ви намагаєтеся запустити, може провалитись або дати неточні результати. Якби ми намагалися створити файл зі $varзмінною, touch $varстворили б два файли, але touch "$var"лише один.
Те саме стосується і вашого [ "$currentoutput" != "$lastoutput" ]боку. Цей конкретний тест виконує порівняння на двох рядках. Коли тест запускається, [команда повинна побачити 3 аргументи - текстовий рядок, !=оператор та інший текстовий рядок. Збереження подвійних лапок запобігає поділу слів, і [команда бачить саме ці 3 аргументи. Тепер, що станеться, якщо змінні не цитуються?
$ var="hello world"
$ foo="hi world"
$ [ $var != $foo ]
bash: [: too many arguments
$
Тут слово розщеплення відбувається, і замість цього [бачить два рядки helloі worldпотім !=, за якими слідують дві інші рядки hi world. Ключовим моментом є те, що без подвійних лапок зміст змінних розуміється як окремі одиниці, а не один цілий елемент.
Призначення заміни команд не вимагає подвійних лапок, як у
var=$( df )
де dfзберігається вихід команди var. Однак корисно завжди подвоювати змінні цитата та підмінювати команди, $(...)якщо ви насправді не хочете, щоб вихід розглядався як окремі елементи.
З боку, примітка
while [ true ]
частина може бути
while true
[це команда, яка оцінює свої аргументи, і [ whatever ]завжди є вірною незалежно від того, що знаходиться всередині. На противагу цьому while trueвикористовується команда, trueяка завжди повертає статус успішного виходу (і саме для цього whileпотрібен цикл). Різниця полягає в трохи більшій чіткості та меншій кількості проведених тестувань. Крім того, ви можете також використовувати :замістьtrue
Подвійні лапки echo "" date and Timeчастково, можливо, можуть бути видалені. Вони просто вставляють порожній рядок і додають додатковий простір у вихід. За бажанням сміливо тримайте їх там, але в цьому випадку особливої функціональної цінності немає.
lsusb >> test.log
Ця частина, можливо, може бути замінена на echo "$currentoutput" >> test.log. Немає причин запускатись lsusbзнову після запуску currentoutput=$(lsusb). У випадках, коли
у вихідному рядку потрібно зберігати нові рядки - цінність можна побачити у виконанні команди кілька разів, але в lsusbцьому немає необхідності. Чим менше зовнішніх команд ви зателефонуєте, тим краще, тому що кожен виклик невбудованої команди вимагає витрат на процесор, використання пам'яті та час виконання (навіть якщо команди, ймовірно, попередньо завантажені з пам'яті).
Дивись також:
while [ true ]це створює нескінченний цикл, але, можливо, не з тієї причини, яку ви вважаєте, що це робить;while [ false ]також створює нескінченний цикл, оскільки з одним аргументом[ ... ]досягається успіху, якщо цей аргумент є не порожнім рядком.while trueнасправді запустить команду з ім'ямtrue(яка завжди вдається).