Найти в Дзене
Кручинин.Linux

Звездочки и кавычки в Linux

Я замечаю, что те, кто изучают Linux, не до конца понимают, что такое * в командах, таких как rm *.bak и чем *.bak отличается от '*.bak' и "*.bak". Начнем с простой команды echo first second third Команда echo принимает три аргумента 1) first 2) second 3) third и выводит их через пробел. В случае если заключить фразу в кавычки
echo 'first second third' или
echo "first second third"
фраза становится одним аргументом. то есть echo печатает только одну фразу 1) first second third Разница не очевидно. Сравним на примере команды rm rm first second third попытается удалить файлы 1) first 2) second 3) third
А команда rm 'first second third' пытается удалить файл 'first second thired' Можно ли без кавычек? Тоже можно, но экранировать пробел: rm first\ second\ third В чем заключаются другие отличия между без кавычек, одинарные или двойные кавычки. Разница в обработке подстановок и переменных. Подстановки Что такое подстановки. ~ меняется на домашний каталог ~+ меняется на текущий каталог ~-
Оглавление

Я замечаю, что те, кто изучают Linux, не до конца понимают, что такое * в командах, таких как rm *.bak и чем *.bak отличается от '*.bak' и "*.bak".

Начнем с простой команды

echo first second third

Команда echo принимает три аргумента

1) first

2) second

3) third

и выводит их через пробел.

В случае если заключить фразу в кавычки
echo 'first second third' или
echo "first second third"
фраза становится одним аргументом.

то есть echo печатает только одну фразу

1) first second third

Разница не очевидно.

Сравним на примере команды rm

rm first second third

попытается удалить файлы

1) first

2) second

3) third
А команда

rm 'first second third'

пытается удалить файл 'first second thired'

-2

Можно ли без кавычек? Тоже можно, но экранировать пробел:

rm first\ second\ third

-3

В чем заключаются другие отличия между без кавычек, одинарные или двойные кавычки.

Разница в обработке подстановок и переменных.

Подстановки

Что такое подстановки.

~ меняется на домашний каталог

~+ меняется на текущий каталог

~- меняется на предыдущий посещенный каталог

{a..z} меняется на перечисление a b c d .... x y z

{01..12} меняется на 01 02 03 04 05 06 07 08 09 10 11 12

* меняется на список файлов в текущем каталоге или остается звездочкой если файлов нет

*2 меняется на список файлов в текущем каталоге, заканчивающихся на 2, или останется *2 если файлов, подпадающих под шаблон нет

Замена с тильдой

-4

Перечисления

-5

Работа с файлами

-6

Переменные

создадим переменную

example=/home/me/TEST/

да, в bash (облочке linux) можно создавать переменные без кавычек.

Но можно и так

example="/home/me/TEST"

далее я могу вывести значение переменной на экран

echo $example

ее можно использовать

cd $example

можно создавать файлы

echo test > $example/file

можно вывести файл на экран

cat $example/file

-7

Теперь давайте рассмотрим, как происходит обработка без кавычек или с кавычками

Без кавычек

Служебные символы (такие как пробелы, скобки, угловые скобки и т.д.) обрабатываются, т.е. пробелы являются разделителем аргументов.

Подстановки заменяются на их значения.

Переменные заменяются на их значения

Допустим мы выполним команду rm $exmaple/*2 $example/file

Чтобы понять, как она отработает, подставим перед ней echo

-8

Очень полезно на самом деле. Потому что если бы еще была команда sudo мы сломали бы систему.

Нет переменной exmaple потому вместо нее ничего и попытка удалить каталоги в корне.

Исправляем rm $example/*2 $example/file

Тоже проверяем echo rm $example/*2 $example/file

-9

Можно удалять.

Двойные кавычки

Допустим команда выглядит так

echo rm "$example/*2 $example/file"

-10

Видим, что переменные заменяются на их значения, а вот подстановки нет.

Одинарные кавычки

А теперь попробуем одинарные кавычки

echo rm '$example/*2 $example/file'

-11

Фраза воспроизведена в точности.

Ни переменные, ни подстановки не заменяются на значения.

А теперь рассмотрим звездочки в команде find

Звездочки в find

Допустим у нас имеется такое дерево каталогов и файлов

-12

Запускаем команду

find . -name *2*

Результат

-13

Давайте посмотрим как на самом деле это работает

-14

*2* заменилось на единственный существующий файл в текущем каталоге и далее find начал искать с точно таким же именем файлы

А на самом деле надо в кавычки заключить

-15

Результат другой.

Потому что в этот раз была выполнена вот какая команда (проверим с помощью echo)

-16

Ну и напоследок, чтобы не выводить имена каталогов, которые соответствуют шаблону, а только файлов, добавим параметр -type f

-17

Вот теперь действительно find получил шаблон а не имя файла.

Подписывайтесь на мой канал в дзен https://dzen.ru/olinux и будете в курсе новых моих статей по компьютерным сетям и ОС GNU/Linux.

Всегда с вами, Сергей Кручинин преподаватель GNU/Linux и компьютерных сетей

-18