Глава 3. Служебные символы | Популярный Linux

Опубликовано Bash в Ср, 23/12/2009 — 20:56


Служебные символы, используемые в текстах сценариев.

#

Комментарии. Строки, начинающиеся с символа # (за исключением комбинации #!) — являются комментариями.

  1. # Эта строка — комментарий.

Комментарии могут располагаться и в конце строки с исполняемым кодом.

  1. echo «Далее следует комментарий.» # Это комментарий.

Комментариям могут предшествовать пробелы (пробел, табуляция).

  1.   # Перед комментарием стоит символ табуляции.
Caution

Исполняемые команды не могут следовать за комментарием в той же самой строке. Пока что еще не существует способа отделения комментария от «исполняемого кода», следующего за комментарием в той же строке.

Note

Само собой разумеется, экранированный символ # в операторе echo не воспринимается как начало комментария. Более того, он может использоваться в операциях подстановки параметров и в константных числовых выражениях.

  1. echo «Символ # не означает начало комментария.»
  2. echo ‘Символ # не означает начало комментария.’
  3. echo Символ \# не означает начало комментария.
  4. echo А здесь символ # означает начало комментария.
  5. echo ${PATH#*:}       # Подстановка — не комментарий.
  6. echo $(( 2#101011 ))  # База системы счисления — не комментарий.
  7. # Спасибо, S.C.

Кавычки » ‘ и \ экранируют
действие символа #.

В операциях поиска по шаблону символ # так же не воспринимается как начало комментария.

;

Разделитель команд. [Точка-с-запятой] Позволяет записывать две и более команд в одной строке.

  1. echo hello; echo there
  2. if [ -x «$filename« ]; then    # Обратите внимание: «if» И «then» разделены точкой с запятой.
  3.                                # Почему?
  4.   echo «Файл $filename найден.»; cp $filename $filename.bak
  5. else
  6.   echo «Файл $filename не найден.»; touch $filename
  7. fi; echo «Конец.»

Следует отметить, что символ «;« иногда так же как и # необходимо экранировать.

;;

Ограничитель в операторе выбора case . [Двойная-точка-с-запятой]

  1. case «$variable« in
  2. abc)  echo «$variable = abc» ;;
  3. xyz)  echo «$variable = xyz» ;;
  4. esac
.

команда «точка». Эквивалент команды source (см. Пример 11-19). Это встроенная команда bash.

.

«точка» может являться частью имени файла . Если имя файла начинается с точки, то это «скрытый» файл, т.е. команда ls при обычных условиях его не отображает.

  1. bash$ touch .hidden-file
  2. bash$ ls -l
  3. total 10
  4.  -rw-r—r—    1 bozo      4034 Jul 18 22:04 data1.addressbook
  5.  -rw-r—r—    1 bozo      4602 May 25 13:58 data1.addressbook.bak
  6.  -rw-r—r—    1 bozo       877 Dec 17  2000 employment.addressbook
  7. bash$ ls -al
  8. total 14
  9.  drwxrwxr-x    2 bozo  bozo      1024 Aug 29 20:54 ./
  10.  drwx——   52 bozo  bozo      3072 Aug 29 20:51 ../
  11.  -rw-r—r—    1 bozo  bozo      4034 Jul 18 22:04 data1.addressbook
  12.  -rw-r—r—    1 bozo  bozo      4602 May 25 13:58 data1.addressbook.bak
  13.  -rw-r—r—    1 bozo  bozo       877 Dec 17  2000 employment.addressbook
  14.  -rw-rw-r—    1 bozo  bozo         0 Aug 29 20:54 .hidden-file
  15.          

Если подразумевается имя каталога, то одна точка означает текущий каталог и две точки — каталог уровнем выше, или родительский каталог.

  1. bash$ pwd
  2. /home/bozo/projects
  3. bash$ cd .
  4. bash$ pwd
  5. /home/bozo/projects
  6. bash$ cd ..
  7. bash$ pwd
  8. /home/bozo/
  9.          

Символ точка довольно часто используется для обозначения каталога назначения в операциях копирования/перемещения файлов.

  1. bash$ cp /home/bozo/current_work/junk/* .
  2.          
.

Символ «точка» в операциях поиска. При выполнении поиска по шаблону , в регулярных выражениях, символ «точка» обозначает одиночный символ.

«

Двойные кавычки . В строке «STRING», ограниченной двойными кавычками не выполняется интерпретация большинства служебных символов, которые могут находиться в строке. см. Глава 5.

Одинарные кавычки . [Одинарные кавычки] ‘STRING’ экранирует все служебные символы в строке STRING. Это более строгая форма экранирования. Смотрите так же Глава 5.

,

Запятая . Оператор запятая используется для вычисления серии арифметических выражений. Вычисляются все выражения, но возвращается результат последнего выражения.

  1. let «t2 = ((a = 9, 15 / 3))»  # Присваивает значение переменной «a» и вычисляет «t2».

\

escape. [обратный слэш] Комбинация \X «экранирует» символ X. Аналогичный эффект имеет комбинация с «одинарными кавычками», т.е. ‘X’. Символ \ может использоваться для экранирования кавычек « и .

Более детальному рассмотрению темы экранирования посвящена Глава 5.

/

Разделитель, используемый в указании пути к каталогам и файлам. [слэш] Отделяет элементы пути к каталогам и файлам (например /home/bozo/projects/Makefile).

В арифметических операциях — это оператор деления.

`

Подстановка команд. [обратные кавычки] Обратные кавычки могут использоваться для записи в переменную команды `command`.

:

пустая команда. [двоеточие] Это эквивалент операции «NOP» (no op, нет операции). Может рассматриваться как синоним встроенной команды true. Команда «:« так же является встроенной командой Bash, которая всегда возвращает «true» (0).

  1. :
  2. echo $?   # 0

Бесконечный цикл:

  1. while :
  2. do
  3.    operation-1
  4.    operation-2
  5.    …
  6.    operation-n
  7. done
  8. # То же самое:
  9. #    while true
  10. #    do
  11. #      …
  12. #    done

Символ-заполнитель в условном операторе if/then:

  1. if condition
  2. then :   # Никаких действий не производится и управление передается дальше
  3. else
  4.    take-some-action
  5. fi

Как символ-заполнитель в операциях, которые предполагают наличие двух операндов, см. Пример 8-2 и параметры по-умолчанию.

  1. : ${username=`whoami`}
  2. # ${username=`whoami`}   без символа : выдает сообщение об ошибке,
  3. #                        если «username» не является командой…

Как символ-заполнитель для оператора вложенного документа. См. Пример 17-10.

В операциях с подстановкой параметров (см. Пример 9-13).

  1. : ${HOSTNAME?} ${USER?} ${MAIL?}
  2. #Вывод сообщения об ошибке, если одна или более переменных не определены.

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

В комбинации с оператором > (оператор перенаправления вывода), усекает длину файла до нуля. Если указан несуществующий файл — то он создается.

  1. : > data.xxx   # Файл «data.xxx» — пуст
  2. # Тот же эффект имеет команда cat /dev/null >data.xxx
  3. # Однако в данном случае не производится создание нового процесса, поскольку «:» является встроенной командой.

См. так же Пример 12-14.

В комбинации с оператором >> — если задано имя существующего файла, то эта комбинация на него никак не влияет (: >> target_file). Если задано имя несуществующего файла, то он создается.

Note

Вышеизложенное применимо только к обычным файлам и неприменимо к конвейерам, символическим ссылкам и другим специальным файлам.

Символ : может использоваться для создания комментариев, хотя и не рекомендуется. Если строка комментария начинается с символа #, то такая строка не проверяется интерпретатором на наличие ошибок. Однако в случае оператора : это не так.

  1. : Это комментарий, который генерирует сообщение об ошибке, ( if [ $x -eq 3] ).

Символ «:« может использоваться как разделитель полей в /etc/passwd и переменной $PATH.

  1. bash$ echo $PATH
  2. /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games
!

инверсия (или логическое отрицание) используемое в условных операторах. Оператор ! инвертирует код завершения команды, к которой он применен. (см. Пример 6-2). Так же используется для логического отрицания в операциях сравнения, например, операция сравнения «равно» ( = ), при использовании оператора отрицания, преобразуется в операцию сравнения — «не равно» ( != ). Символ ! является зарезервированным ключевым словом BASH.

В некоторых случаях символ ! используется для косвенного обращения к переменным.

Кроме того, из командной строки оператор ! запускает механизм историй Bash (см. Приложение H). Примечательно, что этот механизм недоступен из сценариев (т.е. исключительно из командной строки).

*

символ-шаблон. [звездочка] Символ * служит «шаблоном» для подстановки в имена файлов. Одиночный символ * означает любое имя файла в заданном каталоге.

  1. bash$ echo *
  2. abs-book.sgml add-drive.sh agram.sh alias.sh
  3.        

В регулярных выражениях токен * представляет любое количество (в том числе и 0) символов.

*

арифметический оператор. В арифметических выражениях символ * обозначает операцию умножения.

Двойная звездочка (два символа звездочки, следующих подряд друг за другом — **), обозначает операцию возведения в степень.

?

Оператор проверки условия. В некоторых выражениях символ ? служит для проверки выполнения условия.

В конструкциях с двойными скобками, символ ? подобен трехместному оператору языка C. См. Пример 9-29.

В выражениях с подстановкой параметра, символ ? проверяет — установлена ли переменная.

?

сивол-шаблон. Символ ? обозначает одиночный символ при подстановке в имена файлов. В регулярных выражениях служит для обозначения одиночного символа.

$

Подстановка переменной.

  1. var1=5
  2. var2=23skidoo
  3. echo $var1     # 5
  4. echo $var2     # 23skidoo

Символ $, предшествующий имени переменной, указывает на то, что будет получено значение переменной.

$

end-of-line (конец строки). В регулярных выражениях, символ «$» обозначает конец строки.

${}
$*, $@
$?

код завершения. Переменная $? хранит код завершения последней выполненной команды, функции или сценария.

$$

id процесса. Переменная $$ хранит id процесса сценария.

()

группа команд.

  1. (a=hello; echo $a)

Important

Команды, заключенные в круглые скобки исполняются в дочернем процессе — subshell-е.

Переменные, создаваемые в дочернем процессе не видны в «родительском» сценарии. Родительский процесс-сценарий, не может обращаться к переменным, создаваемым в дочернем процессе.

  1. a=123
  2. ( a=321; )
  3. echo «a = $a«   # a = 123
  4. # переменная «a» в скобках подобна локальной переменной.

инициализация массивов.

  1. Array=(element1 element2 element3)

{xxx,yyy,zzz,…}

Фигурные скобки.

  1. grep Linux file*.{txt,htm*}
  2. # Поиск всех вхождений слова «Linux»
  3. # в файлах «fileA.txt», «file2.txt», «fileR.html», «file-87.htm», и пр.

Команда интерпретируется как список команд, разделенных точкой с запятой, с вариациями, представленными в фигурных скобках. [11] При интерпретации имен файлов (подстановка) используются параметры, заключенные в фигурные скобки.

Caution

Использование неэкранированных или неокавыченных пробелов внутри фигурных скобок недопустимо.

echo {file1,file2}\ :{\ A," B",' C'}

file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C

{}

Блок кода. [фигурные скобки] Известен так же как «вложенный блок», эта конструкция, фактически, создает анонимную функцию. Однако, в отличии от обычных функций, переменные, создаваемые во вложенных блоках кода, доступны объемлющему сценарию.

  1. bash$ { local a; a=123; }
  2. bash: local: can only be used in a function
  3.        
  1. a=123
  2. { a=321; }
  3. echo «a = $a«   # a = 321   (значение, присвоенное во вложенном блоке кода)
  4. # Спасибо, S.C.

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

Пример 3-1. Вложенные блоки и перенаправление ввода-вывода

  1. #!/bin/bash
  2. # Чтение строк из файла /etc/fstab.
  3. File=/etc/fstab
  4. {
  5. read line1
  6. read line2
  7. } < $File
  8. echo «Первая строка в $File
  9. echo «$line1«
  10. echo
  11. echo «Вторая строка в $File
  12. echo «$line2«
  13. exit 0

Пример 3-2. Сохранение результата исполнения вложенного блока в файл

  1. #!/bin/bash
  2. # rpm-check.sh
  3. # Запрашивает описание rpm-архива, список файлов, и проверяется возможность установки.
  4. # Результат сохраняется в файле.
  5. #
  6. # Этот сценарий иллюстрирует порядок работы со вложенными блоками кода.
  7. SUCCESS=0
  8. E_NOARGS=65
  9. if [ -z «$1» ]
  10. then
  11.   echo «Порядок использования: `basename $0` rpm-file»
  12.   exit $E_NOARGS
  13. fi
  14. {
  15.   echo
  16.   echo «Описание архива:»
  17.   rpm -qpi $1       # Запрос описания.
  18.   echo
  19.   echo «Список файлов:»
  20.   rpm -qpl $1       # Запрос списка.
  21.   echo
  22.   rpm -i —test $1  # Проверка возможности установки.
  23.   if [ «$?» -eq $SUCCESS ]
  24.   then
  25.     echo «$1 может быть установлен.»
  26.   else
  27.     echo «$1 — установка невозможна!»
  28.   fi
  29.   echo
  30. } > «$1.test»       # Перенаправление вывода в файл.
  31. echo «Результаты проверки rpm-архива находятся в файле $1.test»
  32. # За дополнительной информацией по ключам команды rpm см. man rpm.
  33. exit 0
Note

В отличие от групп команд в (круглых скобках), описаных выше, вложенные блоки кода, заключенные в {фигурные скобки} исполняются в пределах того же процесса, что и сам скрипт (т.е. не вызывают запуск дочернего процесса — subshell). [12]

{} \;

pathname — полное имя файла (т.е. путь к файлу и его имя). Чаще всего используется совместно с командой find.

Note

Обратите внимание на то, что символ «;«, которым завершается ключ -exec команды find, экранируется обратным слэшем. Это необходимо, чтобы предотвратить его интерпретацию.

[ ]

test.

Проверка истинности выражения, заключенного в квадратные скобки [ ]. Примечательно, что [ является частью встроенной команды test (и ее синонимом), И не имеет никакого отношения к «внешней» утилите /usr/bin/test.

[[ ]]

test.

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

См. описание конструкции [[ … ]] ниже.

[ ]

элемент массива.

При работе с массивами в квадратных скобках указывается порядковый номер того элемента массива, к которому производится обращение.

  1. Array[1]=slot_1
  2. echo ${Array[1]}
[ ]

диапазон символов.

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

(( ))

двойные круглые скобки.

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

См. обсуждение, посвященное конструкции (( … )) .

> &> >& >> <

Конструкция scriptname >filename перенаправляет вывод scriptname в файл filename. Если файл filename уже существовал, то его прежнее содержимое будет утеряно.

Конструкция command &>filename перенаправляет вывод команды command, как со stdout, так и с stderr, в файл filename.

Конструкция command >&2 перенаправляет вывод со stdout на stderr.

Конструкция scriptname >>filename добавляет вывод scriptname к файлу filename. Если задано имя несуществующего файла, то он создается.

(command)>

<(command)

В операциях сравнения, символы «<« и «>« обозначают операции сравнения строк .

А так же — операции сравнения целых чисел. См. так же Пример 12-9.

<<

перенаправление ввода на встроенный документ.

<, >

Посимвольное ASCII-сравнение.

  1. veg1=carrots
  2. veg2=tomatoes
  3. if [[ «$veg1« < «$veg2« ]]
  4. then
  5.   echo «Не смотря на то, что в словаре слово $veg1 предшествует слову $veg2
  6.   echo «это никак не отражает мои кулинарные предпочтения.»
  7. else
  8.   echo «Интересно. Каким словарем вы пользуетесь?»
  9. fi

\<, \>

bash$ grep '\<the\>' textfile

|

конвейер. Передает вывод предыдущей команды на ввод следующей или на вход командного интерпретатора shell. Этот метод часто используется для связывания последовательности команд в единую цепочку.

  1. echo ls -l | sh
  2. #  Передает вывод «echo ls -l» команлному интерпретатору shell,
  3. #+ тот же результат дает простая команда «ls -l».
  4. cat *.lst | sort | uniq
  5. # Объединяет все файлы «.lst», сортирует содержимое и удаляет повторяющиеся строки.

Конвейеры (еще их называют каналами) — это классический способ взаимодействия процессов, с помощью которого stdout одного процесса перенаправляется на stdin другого. Обычно используется совместно с командами вывода, такими как cat или echo, от которых поток данных поступает в «фильтр» (команда, которая на входе получает данные, преобразует их и обрабатывает).

cat $filename | grep $search_word

В конвейер могут объединяться и сценарии на языке командной оболочки.

  1. #!/bin/bash
  2. # uppercase.sh : Преобразование вводимых символов в верхний регистр.
  3. tr ‘a-z’ ‘A-Z’
  4. #  Диапазоны символов должны быть заключены в кавычки
  5. #+ чтобы предотвратить порождение имен файлов от однобуквенных имен файлов.
  6. exit 0

А теперь попробуем объединить в конвейер команду
ls -l с этим сценарием.

  1. bash$ ls -l | ./uppercase.sh
  2. -RW-RW-R—    1 BOZO  BOZO       109 APR  7 19:49 1.TXT
  3.  -RW-RW-R—    1 BOZO  BOZO       109 APR 14 16:48 2.TXT
  4.  -RW-R—R—    1 BOZO  BOZO       725 APR 20 20:56 DATA-FILE
  5.        
Note

Выход stdout каждого процесса в конвейере должен читаться на входе stdin последующим, в конвейере, процессом. Если этого не делается, то поток данных блокируется, в результате конвейер будет работать не так как ожидается.

  1. cat file1 file2 | ls -l | sort
  2. # Вывод команды «cat file1 file2» будет утерян.

Конвейер исполняется в дочернем процессе, а посему — не имеет доступа к переменным сценария.

  1. variable=«initial_value»
  2. echo «new_value» | read variable
  3. echo «variable = $variable«     # variable = initial_value

Если одна из команд в конвейере завершается аварийно, то это приводит к аварийному завершению работы всего конвейера.

>|

принудительное перенаправление, даже если установлен ключ noclobber option.

||

логическая операция OR (логическое ИЛИ). В опрециях проверки условий, оператор || возвращает 0 (success), если один из операндов имеет значение true (ИСТИНА).

&

Выполнение задачи в фоне. Команда, за которой стоит &, будет исполняться в фоновом режиме.

  1. bash$ sleep 10 &
  2. [1] 850
  3. [1]+  Done                    sleep 10
  4.        

В сценариях команды, и даже циклы могут запускаться в фоновом режиме.

Пример 3-3. Запуск цикла в фоновом режиме

  1. #!/bin/bash
  2. # background-loop.sh
  3. for i in 1 2 3 4 5 6 7 8 9 10            # Первый цикл.
  4. do
  5.   echo -n «$i «
  6. done & # Запуск цикла в фоне.
  7.        # Иногда возможны случаи выполнения этого цикла после второго цикла.
  8. echo   # Этот ‘echo’ иногда не отображается на экране.
  9. for i in 11 12 13 14 15 16 17 18 19 20   # Второй цикл.
  10. do
  11.   echo -n «$i «
  12. done
  13. echo   # Этот ‘echo’ иногда не отображается на экране.
  14. # ======================================================
  15. # Ожидается, что данный сценарий выведет следующую последовательность:
  16. # 1 2 3 4 5 6 7 8 9 10
  17. # 11 12 13 14 15 16 17 18 19 20
  18. # Иногда возможен такой вариант:
  19. # 11 12 13 14 15 16 17 18 19 20
  20. # 1 2 3 4 5 6 7 8 9 10 bozo $
  21. # (Второй ‘echo’ не был выполнен. Почему?)
  22. # Изредка возможен такой вариант:
  23. # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
  24. # (Первый ‘echo’ не был выполнен. Почему?)
  25. # Крайне редко встречается и такое:
  26. # 11 12 13 1 2 3 4 5 6 7 8 9 10 14 15 16 17 18 19 20
  27. # Второй цикл начал исполняться раньше первого.
  28. exit 0
Caution

Команда, исполняемая в пределах сценария в фоне, может подвесить сценарий, ожидая нажатия клавиши. К счастью, это легко «лечится».

&&

Логическая операция AND (логическое И). В операциях проверки условий, оператор && возвращает 0 (success) тогда, и только тогда, когда оба операнда имеют значение true (ИСТИНА).

префикс ключа. С этого символа начинаются опциональные ключи команд.

COMMAND -[Option1][Option2][...]

ls -al

sort -dfu $filename

set — $variable

  1. if [ $file1 -ot $file2 ]
  2. then
  3.   echo «Файл $file1 был создан раньше чем $file2
  4. fi
  5. if [ «$a« -eq «$b« ]
  6. then
  7.   echo «$a равно $b
  8. fi
  9. if [ «$c« -eq 24 -a «$d« -eq 47 ]
  10. then
  11.   echo «$c равно 24, а $d равно 47.»
  12. fi

перенаправление из/в stdin или stdout. [дефис]

  1. (cd /source/directory && tar cf — . ) | (cd /dest/directory && tar xpvf —)
  2. # Перемещение полного дерева файлов и подкаталогов из одной директории в другую
  3. # [спасибо Алану Коксу (Alan Cox) <a.cox@swansea.ac.uk>, за небольшие поправки]
  4. # 1) cd /source/directory    Переход в исходный каталог, содержимое которого будет перемещено
  5. # 2) &&                     «И-список»: благодаря этому все последующие команды будут выполнены
  6. #                            только тогда, когда ‘cd’ завершится успешно
  7. # 3) tar cf — .              ключом ‘c’ архиватор ‘tar’ создает новый архив,
  8. #                            ключом ‘f’ (file) и последующим ‘-‘ задается файл архива — stdout,
  9. #                            в архив помещается текущий каталог (‘.’) с вложенными подкаталогами.
  10. # 4) |                       конвейер с …
  11. # 5) ( … )                 subshell-ом (дочерним экземпляром командной оболочки)
  12. # 6) cd /dest/directory      Переход в каталог назначения.
  13. # 7) &&                     «И-список», см. выше
  14. # 8) tar xpvf —              Разархивирование (‘x’), с сохранением атрибутов «владельца» и прав доступа (‘p’) к файлам,
  15. #                            с выдачей более подробных сообщений на stdout (‘v’),
  16. #                            файл архива — stdin (‘f’ с последующим ‘-‘).
  17. #
  18. #                            Примечательно, что ‘x’ — это команда, а ‘p’, ‘v’ и ‘f’ — ключи
  19. # Во как!
  20. # Более элегантный вариант:
  21. #   cd source-directory
  22. #   tar cf — . | (cd ../target-directory; tar xzf -)
  23. #
  24. # cp -a /source/directory /dest     имеет тот же эффект.
  1. bunzip2 linux-2.4.3.tar.bz2 | tar xvf —
  2. # —разархивирование tar-файла—    | —затем файл передается утилите «tar»—
  3. # Если у вас утилита «tar» не поддерживает работу с «bunzip2»,
  4. # тогда придется выполнять работу в два этапа, с использованием конвейера.
  5. # Целью данного примера является разархивирование тарбола (tar.bz2) с исходными текстами ядра.

Обратите внимание, что в этом контексте «-« — не самостоятельный оператор Bash, а скорее опция, распознаваемая некоторыми утилитами Unix (такими как tar, cat и т.п.), которые выводят результаты своей работы в stdout.

  1. bash$ echo «whatever» | cat
  2. whatever

В случае, когда ожидается имя файла, тогда «-« перенаправляет вывод на stdout (вспомните пример с tar cf) или принимает ввод с stdin.

  1. bash$ file
  2. Usage: file [-bciknvzL] [-f namefile] [-m magicfiles] file…
  3.        

Сама по себе команда file без параметров
завершается с сообщением об ошибке.

Добавим символ «-« и получим более полезный результат. Это заставит командный интерпретатор ожидать ввода от пользователя.

  1. bash$ file
  2. abc
  3. standard input:              ASCII text
  4. bash$ file
  5. #!/bin/bash
  6. standard input:              Bourne-Again shell script text executable
  7.        

Теперь команда принимает ввод пользователя со
stdin и анализирует его.

Используя передачу stdout по конвейеру другим командам, можно выполнять довольно эффектные трюки, например вставка строк в начало файла.

С помощью команды diff — находить различия между одним файлом и частью другого:

grep Linux file1 | diff file2 -

И наконец пример использования служебного символа "-" с командой tar.

Пример 3-4. Резервное архивирование всех файлов, которые были изменены в течение последних суток

  1. #!/bin/bash
  2. # Резервное архивирование (backup) всех файлов в текущем каталоге,
  3. # которые были изменены в течение последних 24 часов
  4. #+ в тарболл (tarball) (.tar.gz — файл).
  5. BACKUPFILE=backup
  6. archive=${1:-$BACKUPFILE}
  7. #  На случай, если имя архива в командной строке не задано,
  8. #+ т.е. по-умолчанию имя архива — «backup.tar.gz»
  9. tar cvf — `find . -mtime -1 -type f -print` > $archive.tar
  10. gzip $archive.tar
  11. echo «Каталог $PWD заархивирован в файл $archive.tar.gz
  12. #  Stephane Chazelas заметил, что вышеприведенный код будет «падать»
  13. #+ если будет найдено слишком много файлов
  14. #+ или если имена файлов будут содержать символы пробела.
  15. # Им предложен альтернативный код:
  16. # ——————————————————————-
  17. #   find . -mtime -1 -type f -print0 | xargs -0 tar rvf «$archive.tar»
  18. #      используется версия GNU утилиты «find».
  19. #   find . -mtime -1 -type f -exec tar rvf «$archive.tar» ‘{}’ \;
  20. #         более универсальный вариант, хотя и более медленный,
  21. #         зато может использоваться в других версиях UNIX.
  22. # ——————————————————————-
  23. exit 0
Caution

Могут возникнуть конфликтные ситуации между опреатором перенаправления «-« и именами файлов, начинающимися с символа «-«. Поэтому сценарий должен проверять имена файлов и предаварять их префиксом пути, например, ./-FILENAME, $PWD/-FILENAME или $PATHNAME/-FILENAME.

Если значение переменной начинается с символа «-«, то это тоже может быть причиной появления ошибок.

  1. var=«-n»
  2. echo $var
  3. # В данном случае команда приобретет вид «echo -n» и ничего не выведет.

предыдущий рабочий каталог. [дефис] Команда cd — выполнит переход в предыдущий рабочий каталог, путь к которому хранится в переменной окружения $OLDPWD .

Caution

Не путайте оператор «-« (предыдущего рабочего каталога) с оператором «-« (переназначения). Еще раз напомню, что интерпретация символа «-« зависит от контекста, в котором он употребляется.

Минус. Знак минус в арифметических операциях.

=

Символ «равно». Оператор присваивания

  1. a=28
  2. echo $a   # 28

В зависимости от контекста применения, символ «=« может выступать в качестве оператора сравнения.

+

Плюс. Оператор сложения в арифметических операциях.

В зависимости от контекста применения, символ + может выступать как оператор регулярного выражения.

+

Ключ (опция). Дополнительный флаг для ключей (опций) команд.

Отдельные внешние и встроенные команды используют символ «+« для разрешения некоторой опции, а символ «« — для запрещения.

%

модуль. Модуль (остаток от деления) — арифметическая операция.

В зависимости от контекста применения, символ % может выступать в качестве шаблона.

~

домашний каталог. [тильда] Соответствует содержимому внутренней переменной $HOME. ~bozo — домашний каталог пользователя bozo, а команда ls ~bozo выведет содержимое его домашнего каталога. ~/ — это домашний каталог текущего пользователя, а команда ls ~/ выведет содержимое домашнего каталога текущего пользователя.

  1. bash$ echo ~bozo
  2. /home/bozo
  3. bash$ echo ~
  4. /home/bozo
  5. bash$ echo ~/
  6. /home/bozo/
  7. bash$ echo ~:
  8. /home/bozo:
  9. bash$ echo ~nonexistent-user
  10. ~nonexistent-user
  11.        

~+

текущий рабочий каталог. Соответствует содержимому внутренней переменной $PWD.

~-

предыдущий рабочий каталог. Соответствует содержимому внутренней переменной $OLDPWD.

^

начало-строки. В регулярных выражениях символ «^» задает начало строки текста.

Управляющий символ

изменяет поведение терминала или управляет выводом текста. Управляющий символ набирается с клавиатуры как комбинация CONTROL + <клавиша>.

  • Ctl-B

    Курсор — на одну позицию назад (без стирания символа).

  • Ctl-C

    Прерывание выполнения процесса.

  • Ctl-D

    Выход из командного интерпретатора (log out) (аналог команды exit).

    «EOF» (признак конца файла). Этот символ может выступать в качестве завершающего при вводе с stdin.

  • Ctl-G

    «BEL» (звуковой сигнал — «звонок»).

  • Ctl-H

    Backspace («забой») — удаление предыдущего символа.

    1. #!/bin/bash
    2. # Вставка символа Ctl-H в строку.
    3. a=«^H^H»                  # Два символа Ctl-H (backspace).
    4. echo «abcdef»             # abcdef
    5. echo -n «abcdef$a «       # abcd f
    6. # Пробел в конце ^              ^ двойной шаг назад.
    7. echo -n «abcdef$a«        # abcdef
    8. # Пробела в конце нет             backspace не работает (почему?).
    9. # Результаты могут получиться совсем не те, что вы ожидаете.
    10. echo; echo
  • Ctl-I

    Горизонтальная табуляция.

  • Ctl-J

    Перевод строки.

  • Ctl-K

    Вертикальная табуляция.

  • Ctl-L

    Перевод формата (очистка экрана (окна) терминала). Аналогична команде clear.

  • Ctl-M

    Возврат каретки.

    1. #!/bin/bash
    2. # Спасибо Lee Maschmeyer, за этот пример.
    3. read -n 1 -s -p $‘Control-M — переводит курсор в начало этой же строки. Нажмите клавишу Enter. \x0d’
    4.                                   # Разумеется, что, ‘x0d’ — это
    5.                                   # шестнадцатиричный эквивалент Control-M.
    6. echo >&2   #  Перевод строки
    7. read -n 1 -s -p $‘Control-J — переводит курсор в начало другой строки. \x0a’
    8. echo >&2   #  Control-J — это перевод строки.
    9. read -n 1 -s -p $‘А Control-K\x0b — вниз.’
    10. echo >&2   #  Control-K — это вертикальная табуляция.
    11. exit 0
  • Ctl-Q

    Resume (XON).

    Эта комбинация «восстанавливает» работу stdin терминала (см. ниже).

  • Ctl-S

    Suspend (XOFF).

    Эта комбинация «замораживает» stdin терминала. (Для восстановления «работоспособности» — используйте комбинацию Ctl-Q)

  • Ctl-U

    Стирание строки ввода.

  • Ctl-Z

    Приостановка процесса.

Пробельный символ

используется как разделитель команд или переменных. В качестве пробельного символа могут выступать — собственно пробел (space), символ табуляции, символ перевода строки, символ возврата каретки или комбинация из вышеперечисленных символов. В некоторых случаях, таких как присваивание значений переменным, использование пробельных символов недопустимо.

Пустые строки никак не обрабатываются командным интерпретатором и могут свободно использоваться для визуального выделения отдельных блоков сценария.

$IFS — переменная специального назначения. Содержит символы-разделители полей, используемые некоторыми командами. По-умолчанию — пробельные символы.


[11]    Интерпретатор, встретив фигурные скобки, раскрывает их и возвращает полученный список команд, которые затем и исполняет.

[12]    Исключение: блок кода, являющийся частью конвейера, может быть запущен в дочернем процессе (subshell-е).

Запись опубликована в рубрике Без рубрики. Добавьте в закладки постоянную ссылку.