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