Кавычки предотвращают «расщепление слов». Это значит: разбивать переменные на несколько элементов по пробельным символам (или, точнее, по пробелам, табуляциям и символам новой строки, как определено в значении $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(которая всегда будет успешной).