Якщо ви хочете освоїти оболонку Bash в Linux, macOS або іншій системі, подібній UNIX, спеціальні символи (наприклад, ~, *, | і >) мають вирішальне значення. Ми допоможемо вам розгадати ці загадкові послідовності команд Linux і стати героєм ієрогліфів.
Що таке особливі символи?
Є набір символів Оболонка Bash лікується двома різними способами. Коли ви вводите їх у оболонку, вони діють як інструкції або команди та повідомляють оболонці виконувати певну функцію. Подумайте про них як про односимвольні команди.
Іноді ви просто хочете надрукувати символ і не потрібен, щоб він виступав як магічний символ. Існує спосіб, у який ви можете використовувати символ для представлення самого себе, а не його спеціальної функції.
Ми покажемо вам, які символи є «спеціальними» або «мета-» символами, а також як ви можете використовувати їх функціонально та буквально.
~ Домашній каталог
Тильда (~) – це скорочення вашого домашнього каталогу. Це означає, що вам не потрібно вводити повний шлях до вашого домашнього каталогу в командах. Де б ви не знаходилися у файловій системі, ви можете використовувати цю команду, щоб перейти до свого домашнього каталогу:
cd ~
Ви також можете використовувати цю команду з відносними шляхами. Наприклад, якщо ви перебуваєте десь у файловій системі, яка не знаходиться у вашій домашній папці, і хочете перейти до каталогу архіву у вашому робочому каталозі, скористайтеся для цього тильдою:
cd ~/work/archive
. Поточний каталог
Крапка (.) представляє поточний каталог. Ви побачите це в списках каталогів, якщо ви використовуєте параметр -a (усі) з ls.
ls -a
Ви також можете використовувати крапку в командах для позначення шляху до поточного каталогу. Наприклад, якщо ви хочете запустити сценарій з поточного каталогу, ви можете викликати його так:
./script.sh
Це сповіщає Bash шукати в поточному каталозі файл script.sh. Таким чином, він не шукатиме в каталогах на вашому шляху відповідний виконуваний файл або сценарій.
.. Батьківський каталог
Подвійна крапка або «подвійна крапка» (..) представляє батьківський каталог вашого поточного каталогу. Ви можете використовувати це для переміщення на один рівень вгору в дереві каталогів.
cd ..
Ви також можете використовувати цю команду з відносними шляхами, наприклад, якщо ви хочете піднятися на один рівень у дереві каталогів, а потім ввести інший каталог на цьому рівні.
Ви також можете використовувати цю техніку для швидкого переходу до каталогу на тому ж рівні дерева каталогів, що й ваш поточний. Ви стрибаєте на один рівень вгору, а потім повертаєтеся вниз в інший каталог.
cd ../gc_help
/ Роздільник каталогів шляхів
Ви можете використовувати пряму косу риску (/), яку часто називають просто косою рискою, щоб розділити каталоги в імені шляху.
ls ~/work/archive
Одна пряма коса риса представляє найкоротший можливий шлях до каталогу. Оскільки все в дереві каталогів Linux починається з кореневого каталогу, ви можете використовувати цю команду, щоб швидко перейти до кореневого каталогу:
cd /
# Прокоментуйте або обріжте рядки
Найчастіше ви використовуєте хеш або знак числа (#), щоб повідомити оболонку, що далі є коментарем, і він не повинен діяти на нього. Ви можете використовувати його в сценаріях оболонки і — менш корисно — у командному рядку.
# This will be ignored by the Bash shell
Однак це насправді не ігнорується, тому що воно додано до вашої історії команд.
Ви також можете використовувати хеш, щоб обрізати рядкову змінну та видалити деякий текст із початку. Ця команда створює рядкову змінну під назвою this_string.
У цьому прикладі ми призначаємо текст «Дейв Гік!» до змінної.
this_string="Dave Geek!"
Ця команда використовує echo для друку слів «How-To» у вікні терміналу. Він отримує значення, збережене в рядковій змінній, за допомогою a розширення параметрів. Оскільки ми додаємо хеш і текст «Дейв», він обрізає цю частину рядка, перш ніж вона буде передана в ехо.
echo How-To ${this_string#Dave}
Це не змінює значення, що зберігається в рядковій змінній; це впливає лише на те, що надсилається в ехо. Ми можемо використовувати echo, щоб ще раз надрукувати значення рядкової змінної та перевірити це:
echo $this_string
? Підстановка одного символу
Оболонка Bash підтримує три символи підстановки, одним з яких є знак питання (?). Ви використовуєте символи підстановки для заміни символів у шаблонах імен файлів. Ім’я файлу, яке містить символ підстановки, утворює шаблон, який відповідає діапазону імен файлів, а не лише одному.
Підстановка знака питання представляє рівно один символ. Розглянемо такий шаблон імені файлу:
ls badge?.txt
Це перекладається як «список будь-якого файлу з ім’ям, яке починається на «значок» і за яким слідує будь-який один символ перед розширенням імені файлу».
Він відповідає наступним файлам. Зауважте, що деякі мають цифри, а деякі – літери після частини «значка» назви файлу. Підстановка знака питання відповідатиме як літерам, так і цифрам.
Однак цей шаблон назви файлу не відповідає «badge.txt», оскільки ім’я файлу не містить жодного символу між «значком» і розширенням файлу. Підстановка знака питання має відповідати відповідному символу в назві файлу.
Ви також можете використовувати знак питання, щоб знайти всі файли з певною кількістю символів в іменах файлів. Тут перераховано всі текстові файли, які містять рівно п’ять символів у назві файлу:
ls ?????.txt
* Підстановка послідовності символів
Ви можете використовувати зірочку
ls badge*
символ підстановки для будь-якої послідовності символів, включаючи відсутність символів. Розглянемо такий шаблон імені файлу:
An
Він відповідає «badge.txt», оскільки підстановочний знак представляє будь-яку послідовність символів або відсутність символів.
ls source.*
[] An
Набір символів Wildcard
Як описано вище, ви використовуєте знак питання для позначення будь-якого окремого символу, а зірочка — для позначення будь-якої послідовності символів (включаючи відсутність символів). [] Ви можете сформувати шаблон підстановки за допомогою квадратних дужок (
) та символи, які вони містять. Відповідний символ у назві файлу повинен відповідати принаймні одному із символів у наборі символів підстановки.
ls badge_0[246].txt
An
ls badge_[01][789].txt
An
ls badge_[23][1-5].txt
An
; Роздільник команд Shell
ls > count.txt; wc -l count.txt; rm count.txt
An
count.txt; wc -l count.txt; Команда rm count.txt” у вікні термінала width=”646″ height=”122″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”>
Зауважте, що друга команда виконується навіть у разі невдачі першої, третя виконується навіть у разі невдачі другої і так далі.
cd ./doesntexist && cp ~/Documents/reports/* .
А
& фоновий процес
Після того, як ви введете команду у вікні терміналу і вона завершиться, ви повернетеся до командного рядка. Зазвичай це займає лише хвилину або дві. Але якщо ви запустите іншу програму, наприклад gedit, ви не зможете використовувати вікно терміналу, доки не закриєте програму.
gedit command_address.page &
А
Bash показує вам ідентифікатор запущеного процесу, а потім повертає вас до командного рядка. Потім ви можете продовжувати використовувати вікно терміналу.
sortWhen a command has input redirected into it, it might behave differently than when it reads from a named file.
If we use wc to count the words, lines, and characters in a file, it prints the values, and then the filename. If we redirect the contents of the file to wc, it prints the same numeric values but doesn’t know the name of the file from which the data came. It cannot print a filename.
Here are some examples of how you can use wc:
wc words.txtwc> Output Redirection
You can use the right-angle bracket ( > ) to redirect the output from a command (typically, into a file); here’s an example:
ls > files.txtcat files.txtAn
files.txt" у вікні терміналу." width="646" height="382" >
wc doesntexist.txt 2> errors.txtcat errors.txtА
errors.txt" у вікні терміналу." width="646" height="122" >
| Труба
«Труба» об’єднує команди разом. Він приймає вихід з однієї команди і передає його наступній як вхід. Кількість переданих команд (довжина ланцюжка) довільна.
Тут ми будемо використовувати cat, щоб передати вміст файлу words.txt в grep, який витягує будь-який рядок, який містить букву C у нижньому чи верхньому регістрі. grep потім передасть ці рядки для сортування. сортування використовує параметр -r (зворотний), тому відсортовані результати відображатимуться у зворотному порядку.
cat words.txt | grep [cC] | sort -rА
! Логічне НЕ конвеєра та оператор історії
Знак оклику (!) є логічним оператором, який означає НІ.
[ ! -d ./backup ] && mkdir ./backupУ цьому командному рядку є дві команди:
Перша команда – це текст у квадратних дужках;Друга команда — це текст, що йде після подвійного амперсанда &&.
Перша команда використовує ! як логічний оператор. Квадратні дужки вказують на те, що буде проведено випробування. Параметр -d (каталог) перевіряє наявність каталогу, який називається резервною копією. Друга команда створює каталог.
Оскільки подвійні амперсанди розділяють дві команди, Bash виконає лише другу, якщо перша вдасться. Однак це протилежне тому, що нам потрібно. Якщо перевірка каталогу “резервної копії” пройшла успішно, нам не потрібно його створювати. І якщо перевірка каталогу «резервне» завершиться невдало, друга команда не буде виконана, а відсутній каталог не буде створено.
Ось де логічний оператор! Це діє як логічне НІ. Отже, якщо тест пройшов успішно (тобто каталог існує), ! перевертає це на «НЕ успіх», що є невдачею. Отже, друга команда не активована.
Якщо перевірка каталогу не вдається (тобто каталог не існує), ! змінює відповідь на «НЕ невдача», що є успіхом. Отже, виконується команда створення відсутнього каталогу.
Це мало! дає багато удару, коли вам це потрібно!
ls -l -d backupА
!24А
!!Наступне повторно запускає попередню команду:
$ Змінні вирази В оболонці Bash ви створюєте змінні для зберігання значень. Деякі, як змінні середовища,
завжди існують, і ви можете отримати до них доступ у будь-який час, коли відкриваєте вікно терміналу. Вони містять значення, такі як ваше ім’я користувача, домашній каталог і шлях.
echo $USERecho $HOMEecho $PATHAn
ThisDistro=UbuntuMyNumber=2001echo $ThisDistroecho $MyNumberAn
Додайте дужки ( {} ) навколо знака долара та виконайте розширення параметра, щоб отримати значення змінної та дозволити подальші перетворення значення.
MyString=123456qwertyЦе створює змінну, яка містить рядок символів, як показано нижче:
echo ${MyString}Використовуйте таку команду, щоб передати рядок у вікно терміналу:
echo ${myString:6}Щоб повернути підрядок, починаючи з позиції 6 всього рядка, скористайтеся такою командою (зміщення нуля, тому перша позиція дорівнює нулю):
echo ${myString:0:6}Якщо ви хочете повторити підрядок, який починається з нульової позиції і містить наступні шість символів, скористайтеся такою командою:
echo ${myString:4:4}А
Цитування спеціальних символів
Якщо ви хочете використовувати спеціальний символ як буквальний (неспеціальний) символ, ви повинні повідомити оболонку Bash. Це називається цитуванням, і є три способи зробити це.
Якщо ви берете текст у лапки («…»), це перешкоджає Bash діяти на більшість спеціальних символів, і вони просто друкуються. Однак одним помітним винятком є знак долара ($). Він все ще функціонує як символ для виразів змінних, тому ви можете включати значення зі змінних у свій вихід.
echo "Today is $(date)"Наприклад, ця команда друкує дату та час:
echo 'Today is $(date)'Якщо ви берете текст в одинарні лапки ('...'), як показано нижче, це зупиняє функцію всіх спеціальних символів:
echo "Today is $(date)"Ви можете використовувати зворотну косу риску ( ), щоб запобігти тому, щоб наступний символ функціонував як спеціальний символ. Це називається «втечанням» персонажа; див. приклад нижче:
Просто подумайте про спеціальні символи як про дуже короткі команди. Якщо ви запам’ятаєте їхнє використання, це може значно допомогти вашому розумінню оболонки Bash і чужих скриптів.