Professional Documents
Culture Documents
Linux - Shell.programming - pocket.primer.B0C7RNYF9Z 1 133
Linux - Shell.programming - pocket.primer.B0C7RNYF9Z 1 133
LINUX SHELL
ПРОГРАМИРАНЕ
Джобен буквар
Machine Translated by Google
Освалд Кампесато
Дълес, Вирджиния
Бостън, Масачузетс
Ню Делхи
Machine Translated by Google
Авторско право ©2023 от MERCURY LEARNING AND INFORMATION LLC. Всички права запазени.
Тази публикация, части от нея или който и да е придружаващ софтуер не могат да бъдат възпроизвеждани по никакъв
начин, съхранявани в система за извличане от какъвто и да е тип или предавани по какъвто и да е начин, носител,
електронен дисплей или механичен дисплей, включително, но не само, фотокопие , записване, публикации в
Интернет или сканиране без предварително писмено разрешение от издателя.
Издателят признава и уважава всички марки, използвани от компании, производители и разработчици като средство за
разграничаване на техните продукти. Всички имена на марки и продукти, споменати в тази книга, са търговски марки
или марки за услуги на съответните компании. Всяко пропускане или злоупотреба (от всякакъв вид) на марки за услуги
или търговски марки и т.н. не е опит за нарушаване на чужда собственост.
Нашите заглавия са достъпни за осиновяване, лицензиране или закупуване на едро от институции, корпорации и др.
За допълнителна информация, моля, свържете се с отдела за обслужване на клиенти на 800-232-0223 (безплатен).
Всички наши заглавия са достъпни в цифров формат на academicourseware.com и други дигитални доставчици.
Придружаващите файлове (фигури и списъци с кодове) за това заглавие са достъпни, като се
свържете с info@merclearning.com. Единственото задължение на MERCURY LEARNING AND INFORMATION към купувача е да
замени диска въз основа на дефектни материали или дефектна изработка, но не и въз основа на работата или
функционалността на продукта.
Machine Translated by Google
СЪДЪРЖАНИЕ
Предговор
Копиране на файлове
Преместване на файлове
Командването
Главното командване
Команда за опашката
Работа с указатели
Machine Translated by Google
Създаване на директории
Премахване на директории
Навигиране до директории
Преместване на директории
Използване на кавички
Потоци и команди за пренасочване
Метазнаци и класове знаци
Цифри и знаци
Имена на файлове и метасимволи
Резюме
Командата за присъединяване
Командата за сгъване
Командата за разделяне
Командата за сортиране
Уникалната команда
Как да сравняваме файлове
Командата od
Командата tr
Командата cpio
Командите gzip и gunzip
Командата bunzip2
Командата zip
Команди за zip файлове и bz файлове
Вътрешен разделител на полето (IFS)
Данни от диапазон от колони в набор от данни
Работа с неравномерни редове в набори от данни
Резюме
Machine Translated by Google
Командата awk
Вградени променливи, които
контролират awk Как работи командата awk?
Подравняване на текст с командата printf() Условна логика
и оператори за управление
Изявлението while
Резюме
Командата grep
Симулиране на релационни данни с командата grep
Проверка на актуализациите в регистрационен файл
Използване на rm и mv с директории
Използване на командата find с директории
Създаване на указател на указатели
Клониране на набор от поддиректории
Machine Translated by Google
Командата nohup
Изпълнение на команди от разстояние
Как да планирате задачи във фонов режим
Как да прекратим процесите
Резюме
Индекс
Machine Translated by Google
ПРЕДГОВОР
КАКВА Е ЦЕЛТА?
Ако сте потребител на Mac, има три начина да го направите. Първият метод е да
използвате Finder , за да отидете до Приложения > Помощни програми и след това
щракнете два пъти върху приложението Помощни програми . След това, ако вече имате
налична командна обвивка, можете да стартирате нова командна обвивка, като напишете
следната команда:
отворете /Applications/Utilities/Terminal.app
ГЛАВА 1
ВЪВЕДЕНИЕ
T
неговата глава ви запознава с основните команди в bash shell, като напр
навигиране из файловата система, изброяване на файлове и показване на
съдържанието на файловете. Тази глава е плътна и съдържа еклектична
комбинация от теми, за да ви подготви бързо за следващите глави. Ако вече имате
известни познания по програмиране на shell, вероятно можете бързо да прегледате
тази уводна глава и да продължите към Глава 2.
Първата част на тази глава започва с кратко въведение в някои обвивки на Unix и
след това обсъжда файлове, разрешения за файлове и директории. Ще научите също
как да създавате файлове и директории и как да променяте разрешенията за достъп
до тях.
Втората част на тази глава представя прости скриптове на обвивката, заедно с
инструкции как да ги направите изпълними. Shell скриптовете съдържат bash команди
(и по избор могат да съдържат дефинирани от потребителя функции), така че е добра
идея да научите за bash командите, преди да можете да създавате shell скриптове
(което включва bash скриптове).
Третата част от тази глава обсъжда две полезни bash команди: командата cut (за
изрязване или извличане на колони и/или полета от набор от данни) и командата
paste (за „поставяне“ на текст или набори от данни заедно вертикално).
Има няколко точки, които трябва да имате предвид, преди да се задълбочите в подробностите за
скриптовете на обвивката. Първо, shell скриптовете могат да се изпълняват от командния ред след
добавяне на разрешения за „изпълнение“ към текстовия файл, съдържащ shell скрипта. Второ, можете
да използвате помощната програма crontab , за да планирате изпълнението на вашите скриптове на обвивката.
Помощната програма crontab ви позволява да зададете изпълнението на shell скрипт
на почасова, дневна, седмична или месечна база. Задачите, които обикновено се
планират чрез crontab, включват извършване на архивиране и премахване на
нежелани файлове. Ако сте съвсем нов в Unix, имайте предвид, че има начин да
изпълнявате скриптове както от командния ред, така и по „планиран“ начин.
Задаването на разрешения за файл за изпълнение на скрипта от командния ред ще бъде обсъдено п
Трето, съдържанието на всеки shell скрипт може да бъде просто като една команда
или може да включва стотици редове от bash команди. Като цяло по-интересните шел
скриптове включват комбинация от няколко bash команди. Съвет за учене: тъй като
обикновено има няколко начина за получаване на желания резултат, е полезно да
четете скриптове на обвивка на други хора, за да научите как да комбинирате команди
по полезни начини.
• C shell (csh) •
TENEX/TOPS C shell (tcsh)
КАКВО Е BASH?
Bash е акроним за "Bourne Again Shell", който има своите корени в обвивката на
Bourne, създадена от Stephen R. Bourne. Shell скриптове, базирани на Bourne shell, ще
се изпълняват в bash, но обратното не винаги е вярно. Bash shell предоставя
допълнителни функции, които не са налични в Bourne shell, като поддръжка за масиви
(обсъдени по-късно в тази глава).
Machine Translated by Google
https://stackoverflow.com/questions/5725296/dif erence-between-sh-and-bash
В някои среди Bourne shell sh е bash shell, който можете да проверите, като напишете
следната команда:
sh --версия
Ако не сте запознати с командния ред (било то Mac, Linux или персонални компютри), моля,
прочетете Предговора, който предоставя някои полезни указания за достъп до командни
обвивки.
мъж котка
Командата man създава кратки обяснения и ако тези обяснения не са достатъчно ясни,
можете да потърсите онлайн примерни кодове, които предоставят повече подробности.
Machine Translated by Google
Навигация из директории
pwd
/Потребители/jsmith
$ cd $HOME $
cd
Командата на историята
история
!1210
ЗАБЕЛЕЖКА Внимавайте с “!” опция с bash команди, тъй като командата, която съответства на "!" може да
не е този, който възнамерявате. По-безопасно е да използвате командата history и след това изрично да
apple-care.txt checkin-
commands.txt
iphonemeetup.txt kyrgyzstan.txt
outfile.txt output.txt ssl-
instructions.txt
общо 56
-rwx------ 1 персонал на ocampesato 25 януари 06 19:21 apple-care.txt -rwx------ 1 персонал на ocampesato 146 персонал на
ocampesato 146 януари 06 19:21 checkin-commands.txt
-rwx------ 1 ocampesato staff 478 6 януари 19:21 iphonemeetup.txt -rwx------ 1 ocampesato staff 12 6 януари 19:21 kyrgyzstan.txt -rw-
r--r-- 1 ocampesato staff 11 Jan 06 19:21 outfile.txt -rw-r--r-- 1 ocampesato staff 12 Jan 06 19:21 output.txt -rwx------ 1 ocampesato
staff 176 Jan 06 19:21 ssl -instructions.txt
Командата ls -1t (буквите „l“ и „t“) показва базиран на времето дълъг списък:
общо 56
-rwx------ 1 персонал на ocampesato 25 януари 06 19:21 apple-care.txt -rwx------ 1 персонал на ocampesato 146 персонал на
ocampesato 146 януари 06 19:21 checkin-commands.txt -rwx-- ---- 1 персонал на ocampesato 478 6 януари 19:21
iphonemeetup.txt
-rwx------ 1 персонал на ocampesato 12 6 януари 19:21 kyrgyzstan.txt -rw-r--r-- 1 персонал на ocampesato 11 ян 06 19:21 outfile.txt
-rw-r--r-- 1 персонал на ocampesato 12 януари 06 19:21 output.txt -rwx------ 1 персонал на ocampesato 176 6 януари 19:21 ssl-
instructions.txt
общо 56
-rwx------ 1 ocampesato staff 176 Jan 06 19:21 ssl-instructions.txt -rw-r--r-- 1 ocampesato staff 12 Jan 06 19:21
output.txt -rw-r--r -- 1 ocampesato
-rwx------ 1 ocampesato staff 12 януари 06 19:21 kyrgyzstan.txt -rwx------ 1 ocampesato staff 478 Jan 06 19:21 iphonemeetup.txt
-rwx------ 1 ocampesato персонал 146 06 януари 19:21 checkin-commands.txt -rwx------ 1 ocampesato персонал 25 януари 06 19:21
apple-care.txt
Колона #1: представлява тип файл и разрешение, дадено за файла (вижте по-долу)
Колона #2: броят блокове памет, заети от файла или директорията
Колона #3: (bash потребител) собственик на файла
Колона #4: представлява групата на собственика
Колона #5: представлява размера на файла в байтове
Колона #6: датата и часа, когато този файл е създаден или последно модифициран
В примера за списък с ls -l всеки файлов ред започва с d, - или l. Тези знаци показват типа
файл, който е в списъка. Тези (и други) първоначални стойности са описани по следния начин:
-
Обикновен файл (ASCII текстов файл, двоичен изпълним файл или твърда връзка)
b Блокирайте специален файл (като физически твърд диск)
Специален файл със знаци (като физически твърд диск)
Файл с директория, който съдържа списък с други файлове и директории.
cdl Файл със символна
стр връзка Наименуван канал (механизъм за комуникация между процесите)
с Гнездо (за комуникация между процесите)
Командата на котката
cat longfile.txt
съдържанието на този
дълъг файл
е твърде дълго,
за да се види на един
екран и на всеки ред
съдържа
едно или
повече думи и
ако използвате
котката
командвам
(другите редове са пропуснати)
Предходната команда показва съдържанието на файл; има обаче няколко команди, които
показват само част от файл, като по-малко, повече, страница, глава и опашка (всички те ще бъдат
обсъдени по-късно).
Като друг пример, да предположим, че файлът temp1 има следното
съдържание:
котешка температура?
глава longfile.txt
съдържанието
от този
дълъг файл са
твърде дълги, за да
се видят в a
едно или
повече думи
съдържанието на това
Machine Translated by Google
дългите
файлове са твърде дълги
опашка longfile.txt
обвивка, включително
обвивката bash
csh
zsh
кш
и обвивка на Борн
ЗАБЕЛЕЖКА Последните два реда в предходния резултат са празни редове (не са типографска
грешка на тази страница).
повече longfile.txt
Символът за тръба
и ако използвате
командата cat
съдържанието на файла
превъртане
11 и ако 12 използвате
котката
13 команда 14 съдържанието
на файла 15 превъртане
Командата за сгъване
съдържанието на този дълъг файл е твърде дълго, за да се види на един екран и всеки ред съдържа една
или повече думи и ако използвате командата cat, съдържанието на файла се превърта извън екрана, така че
можете да използвате други команди като глава или опашка или повече команди във връзка с командата pipe,
която е много полезна в Bash и е достъпна във всяка обвивка, включително обвивката на bash csh zsh ksh
и обвивката на Bourne
n така че можете да използвате други команди като h head или tail или повече команди
във връзка с командата pipe, която е много полезна в U nix и е налична във всяка
обвивка, включително bash shell csh zsh ksh и Bourne shell
Bash файловете могат да имат частични или пълни rwx привилегии (където r е
привилегията за четене, w е привилегията за запис и x е привилегията за изпълнение,
което означава, че даден файл може да бъде изпълнен от командния ред) просто чрез
въвеждане на името на файла ( или пълния път до файла, ако файлът не е във вашия текущ
Machine Translated by Google
СКРИТИ ФАЙЛОВЕ
ls -a
. .профил .rhosts документи либ Резултати от тестовете
.. домакини потребители
Проблемните имена на файлове съдържат един или повече интервали, скрити (непечатаеми)
знаци или започват с тире („-“).
Можете да използвате двойни кавички, за да изброявате имена на файлове, които съдържат интервали, или
ls -1 "Едно пространство.txt"
ls -l One\ Space.txt
mv -- -abc.txt преименуван-abc.txt
Machine Translated by Google
Командата env
SHELL=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/73/39lngcln4dj_scmgvsv53g_w0000gn/T/ OLDPWD=/tmp
TERM_SESSION_ID=63101060-9DF0-405E-84E1-EC56282F4803 USER=ocampesato
COMMAND_MODE=bash2003PATH=/
o pt/local/bin:/Users/ocampesato/ android-sdk -mac_86/platform-tools:/Users/ocampesato/ android-sdk-mac_86/
tools:/usr/local/bin: PWD=/Users/ocampesato JAVA_HOME=/System/Library/Java/JavaVirtualMachines/
1.6.0.jdk/ Content ts/Home LANG=en_US.UTF-8 NODE_PATH=/usr/local/lib/
node_modules HOME=/Users/ocampesato
LOGNAME=ocampesato DISPLAY=/tmp/launch-xnTgkE/org.macosforge.xquartz:0 SECURITYSESSIONID=186a4
_=/usr/bin/env
https://stackoverflow.com/questions/13998075/setting-environment-
variable-for-one-program-call-in-bash-using-env
експортиране PATH=$HOME/anaconda:$PATH
експортиране на PATH="$PATH:/usr/local/bin/python"
PATH="$PATH:/usr/local/bin/python"
h1=$HOME/тест
Ехо $h1
/Потребители/jsmith/тест
Като пример, можете да замените командата ls -ltr (буквите „l“, „t“ и „r“), която
видяхте по-рано в главата, с псевдонима ltr и ще видите същия обърнат времеви
дълго списък с имена на файлове (възпроизведен тук):
общо 56
-rw-r--r-- 1 персонал ocampesato 12 януари 06 19:21 output.txt -rw-r--r-- 1 персонал ocampesato 11 януари 06 19:21
outfile.txt -rwx------ 1 ocampesato staff 12 Jan 06 19:21 kyrgyzstan.txt -rwx------ 1 ocampesato staff 478 Jan 06 19:21
iphonemeetup.txt -rwx------ 1 ocampesato staff 146 Jan 06 19:21 checkin -commands.txt -rwx------ 1 ocampesato staff 25 януари
06 19:21 apple-care.txt
Можете също така да дефинирате псевдоним, който съдържа символа bash pipe („|“):
Има няколко налични команди за намиране на изпълними файлове (двоични файлове или
скриптове на обвивката) чрез търсене в директориите в променливата на средата PATH : which,
wheres , whereis и whatis. Тези команди дават подобни резултати като команда which , както е
обсъдено по-долу.
Командата which дава пълния път до изпълнимия файл, който посочите, или празен ред,
ако изпълнимият файл не е в никоя директория, която е посочена в променливата на средата
PATH . Това е полезно за намиране дали определена команда или помощна програма е
инсталирана в системата.
който rm
/bin/rm
$ където е rm /bin/
rm
Командата whatis търси указаната команда в базата данни whatis , което е полезно за
идентифициране на системни команди и важни конфигурационни файлове:
printf "%-5s %-10s %-4s\n" ABC DEF GHI printf "%-5s %-10s %-4.2f\n" ABC
DEF 12.3456
Направете shell скрипта изпълним и след това стартирайте shell скрипта, след
което ще видите следния резултат:
АБВГДЕ GHI
АБВГДЕ 12.35 ч
https://unix.stackexchange.com/questions/65803/why-is-printf-better-than-
echo
КОМАНДАТА ЗА РЯЗАНЕ
Резултатът (използване на интервал " " като IFS и -f2 за обозначаване на втората
колона) на предходния кодов фрагмент е тук:
деф
пр.н.е
име на файл="06.22.04p.vp.0.tgz"
Листинг 1.1 използва командата echo и командата cut за инициализиране на променливите f1, f2,
f3, f4 и f5, след което се конструира ново име на файл.
Резултатът от предходния шел скрипт е тук:
Machine Translated by Google
x5 = 123 456
Стойността на x3 вероятно е различна от очакваната: има само едно празно място между 123 и 456
Този на пръв поглед незначителен детайл е важен, когато пишете шел скриптове,
които проверяват стойностите, съдържащи се в конкретни колони от текстови
файлове, като файлове за заплати и други файлове с финансови данни. Решението
включва използването на двойни кавички (а понякога и IFS променливата, която е
обсъдена в глава 2), която можете да видите в дефиницията на x4.
Machine Translated by Google
done
Листинг 1.3 съдържа for цикъл, който показва имената на файловете (в текущия
директория), които имат суфикс py .
Резултатът от списък 1.3 на моя MacBook е тук:
ЗАБЕЛЕЖКА Резултатът зависи от това дали имате файлове с .py суфикс в директорията, където
изпълнявате CommandSubst.sh.
На този етап сте виждали различни комбинации от bash команди, които са свързани с
„|“ символ. Освен това можете да пренасочите изхода към
Machine Translated by Google
Какво се случва, ако има междинни грешки? Видяхте как да пренасочвате съобщения
за грешка към /dev/null и можете също така да пренасочвате съобщения за грешка към
текстов файл, ако трябва да ги прегледате. Още една опция е да пренасочите stderr
(„стандартна грешка“) към stdout („стандартен изход“), което е извън обхвата на тази глава.
Използвайте символа двоен амперсанд && , ако искате да изпълните команда само
ако предишна команда е успешна. Например командата cd работи само ако командата
mkdir успее в следния кодов фрагмент:
Можете да комбинирате няколко команди с точка и запетая („;“), както е показано тук:
/tmp
/Потребители/jsmith
/tmp /Потребители/jsmith
КОМАНДАТА PASTE
Machine Translated by Google
cp abc.sh cp
abc2.sh cp
abc3.sh
деф.ш
def2.sh
def3.sh
cp abc.sh cp деф.ш
Вместо да обединявате два файла с еднаква дължина, пастата може да се използва и за добавяне
същото нещо за всеки ред във файл.
Да предположим, че текстовият файл names.txt съдържа следните редове:
Джейн Смит
Джон Джоунс
Дейв Едуардс
Джейн Смит
Джон Джоунс
Дейв Едуардс
Вмъкнете празен ред след всеки друг ред в names.txt с тази команда:
Резултатът е тук:
Джейн Смит
Джон Джоунс
Дейв Едуардс
Вмъкнете празен ред след всеки трети ред в names.txt с тази команда:
Резултатът е тук:
Джейн Смит
Джон Джоунс
Дейв Едуардс
Имайте предвид, че има празен ред след третия ред в предходния изход.
Machine Translated by Google
Примерният код в този раздел ви показва как да използвате командата paste за свързване на
последователни редове в набор от данни. Списък 1.7 показва съдържанието на line-pairs.csv , който
съдържа двойки букви и цифри, а листинг 1.8 съдържа reversecolumns.sh, който илюстрира как да
съпоставите двойките, въпреки че прекъсванията на редовете са на различни места между цифрите и
буквите.
a,b,c,d,e,f,gh,i,j,k,l
1,2,3,4,5,6,7,8,9
10,11,12
inputfile="linepairs.csv"
outputfile="linepairsjoined.csv"
Съдържанието на изходния файл е показано тук (обърнете внимание, че скриптът просто свързва
двойки редове и примерите за команди с три и четири реда са коментирани):
a,b,c,d,e,f,gh,i,j,k,l 1,2,3,4,5,6,7,8,9
10,11,12
Забележете, че предходният изход не е напълно правилен: има „ “ вместо „,” винаги, когато двойка
ревизия редове е съединена (между „g” интервал и „h” и „9 и 10”). Можем да направим необходимата
с помощта на командата sed (обсъдена в Глава 4):
Джейн, Смит
Дейв, Джоунс
Сара, Едуардс
inputfile="namepairs.csv"
outputfile="reversenames.csv" fnames="fnames"
lnames="lnames"
cat $inputfile|cut -d"," -f1 > $fnames cat $inputfile|cut -d"," -f2 >
$lnames
Смит, Джейн
Джоунс, Дейв
Едуардс, Сара
Кодът в листинг 1.10 (след премахване на празни редове) се състои от седем реда
код, които включват създаване на два допълнителни междинни файла. Освен ако не се
нуждаете от тези файлове, добра идея е да премахнете тези два файла (което можете
да направите с една rm команда).
Machine Translated by Google
Смит, Джейн
Джоунс, Дейв
Едуардс, Сара
Както можете да видите, има голяма разлика между тези две решения. Ако не сте
запознати с командата awk , тогава не бихте се сетили за второто решение. Въпреки
това, колкото повече научавате за bash командите и как да ги комбинирате, толкова
по-сръчни ще ставате по отношение на писането на по-добри скриптове на обвивката
за решаване на задачи за почистване на данни. Друг важен момент: документирайте
командите, когато стават по-сложни, тъй като могат да бъдат трудни за
интерпретиране по-късно от другите или дори от вас самите, ако е минало достатъчно
време. Коментар като следния може да бъде изключително полезен за тълкуване на код:
# Тази команда обръща имената и фамилиите в namepairs.txt cat namepairs.txt |awk -F","
'{print $2 "," $1}'
РАБОТА С МЕТАХАРАКТЕРИ
Изразът a+ съответства на низа a, последван от един или повече знака, като a1, a2, … , aa,
ab и ac (но abc и a12 не съвпадат).
Изразът a* съответства на низа a, последван от нула или повече знаци, като a, a1,
…, aa, ab и ac.
Тръбата „|“ метазнак (който има различен контекст от символа за тръба в
командния ред: регулярните изрази имат свой собствен синтаксис, който не съвпада
с този на операционната система през повечето време) предоставя избор от опции.
Например изразът a|b означава a или b, а изразът a|b|c означава a или b или c.
Главна буква. Можете също да посочите поддиапазони от цифри или букви, като
[3-7], [gp] и [FX], както и други комбинации:
^[az] съвпада с всяка малка буква в началото на ред от текст ^[^az] съвпада
с всеки ред от текст, който не започва с малка буква
Въз основа на това, което сте научили досега, можете да разберете целта
от следните регулярни изрази:
([az]|[AZ]): или малка буква, или главна буква (^[az][az]): начална малка
буква, последвана от друга малка буква ^[^az][AZ]): нещо различно от
малка буква,
последвана от главна буква
^[0-9]
^[^0-9]
Така знакът ^ вътре в двойка съвпадащи квадратни скоби („[]”) отрича израза
непосредствено вдясно от него, който също е вътре в квадратните скоби.
Machine Translated by Google
Ами ZSH?
който зш
и резултатът ще бъде
/bin/zsh
• z-команда •
автоматично
довършване •
автоматична корекция • персонализиране на цветовете
Machine Translated by Google
За разлика от zsh, обвивката bash няма вградено разширение със заместващи знаци.
Следователно довършването на табулатори в bash действа като изход на команда. Довършването
на табулатори в zsh прилича на „падащ“ списък, който изчезва, след като въведете допълнителни
знаци.
https://sunlightmedia.org/bash-vs-zsh
chsh -s /bin/zsh
Превключете от zsh обратно към bash с тази команда:
chsh -s /bin/bash
Имайте предвид, че и двете предходни команди засягат само командната обвивка, където сте
стартирали командите.
Конфигуриране на zsh
РЕЗЮМЕ
Тази глава започна с въведение в някои обвивки на Unix, последвано от кратко обсъждане на
файлове, разрешения за файлове и директории. Освен това научихте как да създавате файлове и
директории и как да ги променяте
Machine Translated by Google
ГЛАВА 2
ФАЙЛОВЕ И ДИРЕКТОРИИ
T
неговата глава обсъжда файлове и директории и различни полезни bash
команди за тяхното управление. Ще научите как да използвате прости команди, които могат да
опростят задачите ви. В Глава 8 и Глава 9 ще научите как да създавате shell скриптове, включващи
някои от командите в тази глава, което допълнително ще намали времето, което отделяте за изпълнение
на рутинни задачи.
Този раздел обсъжда команди, свързани с файлове в bash, като touch, cp и rm , които ви позволяват
докоснете abc
Копиране на файлове
Можете да копирате файла abc (или всеки друг файл) в abc2 с тази команда:
cp abc abc2
Бъдете внимателни, когато използвате cp команда: ако целевият файл вече съществува,
уверете се, че наистина искате да презапишете съдържанието му с изходния файл.
Въпреки това, следната команда замества файла abc2 със съдържанието на файла
abc:
cp abc*
cp abc abc2
set -o noclobber
cd $HOME/abc . ../
cp -r def
Тази команда няма да копира никакви поддиректории, които имат суфикс txt.
Ако искате да копирате файлове, които имат суфикс .txt, използвайте тази команда:
Machine Translated by Google
Друго предупреждение: ако имате директорията abc.txt или друга директория със суфикс .txt ,
тогава съдържанието на тази директория няма да бъде копирано (ще видите съобщение за грешка).
Следните команди също няма да успеят да копират съдържанието на abc.txt в текстовите файлове на
поддиректорията :
Изтриване на
rm abc
rm -rf *
ls *.sh
rm *.sh
rm `cat remove_list.txt`
Ако има възможност (в някакъв момент в бъдещето), че може да имате нужда от някои
от файловете, които възнамерявате да изтриете, друга опция е да създадете директория и
да преместите тези файлове в тази директория, както е показано тук:
Преместване на файлове
Командването
ln -s $HOME/document1.txt doc2
Ако премахнете doc2, това няма да засегне $HOME/document1.txt. Въпреки това, ако
премахнете последния файл, без да премахнете doc2, тогава doc2 ще продължи да се
показва в дълъг списък, но когато се опитате да видите съдържанието на doc2, файлът
е празен (както бихте очаквали).
b.js .js
$
базово име "$a" .js ab
$ dirname $x /tmp
Machine Translated by Google
$ файл /bin/ls
/bin/ls: Mach-O 64-битов изпълним x86_64
WC КОМАНДАТА
3 6 25 apple-care.txt
12 28 146 checkin-commands.txt
27 55 478 iphonemeetup.txt
12 kyrgyzstan.txt
21 12 11 outfile.txt
2 2 12 output.txt
11 176 ssl-instructions.txt
5 52 105 общо 860
1 2 11 outfile.txt
2 2 12 output.txt
3 4 23 общо
7 7 112
КОМАНДАТА НА КОТКАТА
Machine Translated by Google
Командата cat показва цялото съдържание на файл, което е удобно за малки файлове. За
по-дълги файлове можете да използвате командата more, която ви позволява да „листирате“
през съдържанието на файл.
Въведете командата
котка iphonemeetup.txt
iPhone среща
==============
* iPhone.WebDev.com
* iui.googlecode.com *
tinyurl.sqllite.com *
touchcode.googlecode.com: отворен код поддържа JSON
iphonemeetup.txt:
21 48 417 iphonemeetup.txt
още abc.txt
Като алтернатива можете да използвате този формуляр, но не забравяйте, че той е по-малко ефективен
Командата more съдържа някои полезни опции. Например, ако искате командата
more да започне от 15-ия ред във файл вместо от първия ред, използвайте тази
команда:
Ако даден файл съдържа няколко последователни празни реда, можете да ги премахнете
от изхода с тази команда:
повече -s abc.txt
още +/abc.txt
ГЛАВАТА КОМАНДАВА
глава -3 test.txt
Можете да покажете първите три реда на няколко файла. Следната команда показва първите три реда в
Следният кодов фрагмент проверява дали първият ред на test.txt съдържа низа
aa:
10 22 224
КОМАНДАТА НА ОПАШКАТА
Командата tail ви позволява да показвате набор от редове в края на файл, а номерът по подразбиране
опашка -3 test.txt
Можете да покажете последните три реда на множество файлове. Следната команда показва
опашка -3 колони[2-4].txt
четири пет
Следният кодов фрагмент проверява дали първият ред на test.txt съдържа низа aa:
Machine Translated by Google
Първото число и в двата изходни списъка е 10, което потвърждава, че се показват само първите 10 реда или последните
десет реда. Обърнете внимание, че ако файлът съдържа 10 или по-малко реда, тогава изходът за глава, опашка, котка и
други е идентичен.
==============
* iPhone.WebDev.com
опашка -f /tmp/abc
• -1 потиска колона 1 • -2
потиска колона 2 • -3 потиска
колона 3 • -12 потиска и двете
колони 1 и 2
Командата dirname премахва основното име от име на файл, като отпечатва само
информацията за пътя.
Командата strings показва низове за печат (ако има такива) в двоичен файл или файл с
данни. Примерно извикване е тук:
низове /bin/ls
$FreeBSD: src/bin/ls/cmp.c,v 1.12 2002/06/30 05:13:54 obrien Exp $ @(#) Copyright (c) 1989, 1993, 1994 The
Regents of the University of California. Всички права
запазени.
$FreeBSD: src/bin/ls/ls.c,v 1.66 2002/09/21 01:28:36 wollman Exp $ $FreeBSD: src/bin/ls/print.c,v 1.57
2002/08/29 14: 29:09 keramida Exp $ $FreeBSD: src/bin/ls/util.c,v 1.38 2005/06/03 11:05:58 dd Exp $ \\""
1@ABCFGHLOPRSTUWabcdefghiklmnopqrstuvwx bin/ls
Unix2003
Всеки файл в bash съдържа набор от разрешения за три различни потребителски групи:
собственикът, групата и света. Наборът от разрешения за четене, запис и изпълнение, които
имат стойност съответно 4, 2 и 1, в основа 8 (осмична). По този начин разрешенията за файл
във всяка група могат да имат следното
Machine Translated by Google
Командата chmod
Следната команда задава бита SUID (Set owner User ID) в разрешенията за име на
файл , което позволява на обикновен потребител да изпълни име на файл със същите
привилегии като собственика на файла (но не е приложимо за скриптове на обвивка):
Глава 4 обсъжда как да използвате условна логика за проверка (и също така за промяна) на
разрешенията за файлове чрез скриптове на обвивката.
Всеки път, когато създавате файл в bash, променливата на средата umask съдържа
допълнението (база 8) на разрешенията по подразбиране, които са присвоени на този
файл. Можете да видите стойността на umask , като напишете тази команда в
командния ред и нейната типична стойност е 0022. Ако извършите (база 8) допълнение
на тази стойност, резултатът е 755.
Machine Translated by Google
РАБОТА С УКАЗАТЕЛНИЦИ
/etc/passwd /users/
oac/ml/class /dev/rdsk/Os5
Името на пътя може също да бъде относително към текущата ви работна директория.
Относителните имена на пътища започват с ./.
cd $HOME cd
~ cd
cd ~потребителско име
Machine Translated by Google
cd -
Директориите са подредени в йерархия с корен (/) в горната част. Позицията на всеки файл
в йерархията се описва с пълния му път.
Елементите на името на пътя са разделени с /. Името на пътя е абсолютно, ако е описано във
връзка с root, така че абсолютните имена на пътища винаги започват с /.
Ето няколко примера за абсолютни имена на файлове:
/etc/passwd /
users/oac/ml/class /dev/rdsk/
Os5
$ pwd
/Потребители/собственик/Изтегляния
$ ls /usr/bin
fc
fddist
fdesetup fg
fgrep
файл
Създаване на директории
Ако укажете няколко директории на командния ред, mkdir създава всяка от директориите.
Например следната команда създава директориите docs и pub като братя и сестри в текущата
директория:
Сравнете предходната команда със следната команда, която създава тест на директорията и
данни от поддиректория в текущата директория:
mkdir -p тест/данни
Опцията -p принуждава създаването на липсващи междинни директории (ако има такива). Ако
междинна директория не съществува, mkdir издава съобщение за грешка. Да предположим
например, че акаунтът на междинната поддиректория не съществува в следния кодов фрагмент:
mkdir -p $HOME/a/b/c/нова-директория
$HOME/a
$HOME/a/b
$HOME/a/b/c
$HOME/a/b/c/нова-директория
Премахване на директории
rmdir dirname1
Ако обаче има файлове в директорията dirname1 , можете да използвате или тази
команда
rm -r dirname1
cd dirname1 rm
-rf * cd ../
rmdir
dirname1
Навигиране до директории
cd dirname
cd /usr/local/bin
ще се промени в директорията
/usr/local/bin
Можете да промените директории, като използвате абсолютен път (както в предишния пример)
или чрез относителен път. Например, можете да превключите от това
Machine Translated by Google
cd ../../home/jsmith
Преместване на директории
Въпреки това, ако целевата директория вече съществува и съдържа поне един
файл, тогава командата mv ще се провали, пример за което е тук:
Има три вида кавички: единични кавички ('), двойни кавички (“) и обратни кавички (`), които
се срещат в съвпадащи двойки ('', “”, или ``).
Въпреки че тези знаци за кавички може да изглеждат взаимозаменяеми, има някои разлики.
Machine Translated by Google
ехо $PATH
ехо '$PATH'
ls ~ | wc -л
Machine Translated by Google
Числата 0,1 и 2 имат специално значение, когато 0 се предхожда от символа „<“, а също и
когато числата 1 и 2 са последвани от символа „>“, без интервали между цифрата 0 и „< ” и без
интервали между цифрите 1 и 2 и „>.”
В тази ситуация 0 се отнася за стандартен вход (stdin), 1 се отнася за стандартен изход (stdout)
и 2 се отнася за стандартна грешка (stderr). Моделът 1>file1 и 2>file2 ви позволява да пренасочвате
изход от изпълним файл.
В допълнение, „директорията“ /dev/null се отнася до кофата с нулеви битове и всичко, което
пренасочвате към тази директория, по същество се изхвърля. Тази конструкция е полезна, когато
искате да пренасочите съобщение за грешка, което може безопасно да бъде игнорирано.
cmd > myfile cmd >> пренасочва изхода на cmd към myfile
myfile cmd < myfile cmd добавя изхода на cmd към myfile изпраща съдържанието на
1>out1 2>out2 myfile към cmd
изпраща stdout към out1 и stderr към out2
cmd 2>&1 1>onefile1 изпраща stdout и stderr към onefile1
Можете също така да пренасочвате съобщенията за грешка към /dev/null, което означава, че вие
никога няма да видите тези съобщения за грешка.
Machine Translated by Google
ls /temp 2>/dev/null
ЗАБЕЛЕЖКА Пренасочвайте съобщенията за грешка към /dev/null само ако сте сигурни, че могат
безопасно да бъдат игнорирани.
Както видяхте в глава 1, bash поддържа метасимволи, както и регулярни изрази. Ако
сте работили със скриптов език като Perl или езици като JavaScript и Java, несъмнено сте
срещали метасимволи. Ето разширен списък с метасимволи, които bash shell поддържа:
? (0 или 1): * (0 а? съвпада с низ a (но не ab) a* съвпада с низ aaa (но
или повече): + (1 или не baa) a+ съвпада с aaa (но не baa)
повече):
Machine Translated by Google
^
(начало на ред): ^[a] съвпада с низа abc (но не bc) $ (край на реда): [c]$ съвпада с низа abc (но не и cab) .
(единична точка): съответства на всеки знак (с изключение на нов ред)
Цифри и знаци
Можете да дефинирате подобни модели, като използвате главни или малки букви:
ls -l файл*
Machine Translated by Google
ls -l файл?
$ ls -l файл [2-3]
ls -l файл??
Повечето команди ви позволяват да посочите множество аргументи. Ако нито един файл
не съответства на даден аргумент, командата игнорира аргумента. Ето друга команда, която
отчита и четирите файла:
ls -l файл0* файл[1-3]
Да предположим, че една команда има един или повече аргументи, които включват един
или повече метасимволи. Ако нито един от аргументите не съвпада с имена на файлове,
обвивката предава аргументите на програмата с непокътнати метасимволи. Когато програмата
очаква валидно име на файл, може да възникне неочаквана грешка.
Друг метазнак ви позволява лесно да препращате към началната си директория. За
Например, следната команда изброява файловете в домашната директория на потребителя:
ls ~
РЕЗЮМЕ
Тази глава започна с обяснение на файловите разрешения за файлове и директории и как да ги зададете според
вашите изисквания. След това научихте за набор от команди, свързани с файлове, включително командите touch, mv, cp и rm.
Machine Translated by Google
ГЛАВА 3
ПОЛЕЗНИ КОМАНДИ
Първата част на тази глава ви показва как да обединявате, сгъвате и разделяте текстови файлове.
Този раздел също така ви показва как да сортирате файлове и да намирате уникални редове във
файлове, като използвате съответно командите sort и uniq . Последната част обяснява как да сравнявате
текстови файлове и двоични файлове.
Вторият раздел ви запознава с командата find , която е мощна команда, която поддържа много
опции. Например, можете да търсите файлове в текущата директория или в поддиректории и можете
да търсите файлове въз основа на датата на тяхното създаване и датата на последна промяна. Една
удобна комбинация е да „пренасочите“ изхода от командата find към командата за търсене на файлове
за конкретен модел. След това ще видите как да използвате
xargs командата tr , инструмент, който обработва
много често използвани текстови трансформации, като изписване с главни букви или премахване на
интервали. След раздела, който обсъжда командата tr , ще видите случай на употреба, който ви показва
как да използвате командата tr , за да премахнете контролния знак ^M от набор от данни.
Третият раздел съдържа команди, свързани с компресията, като cpio, tar и bash команди за управление
на файлове, които вече са компресирани (като и zmore). zdiff, zcmp, Четвъртият раздел ви запознава с
която е полезна, опцията IFS ,
когато трябва да посочите разделител на полето, който не е по подразбиране, докато извличате данни
от диапазон от колони в набор от данни. Ще видите също как да използвате командата за „line
xargs
нагоре“ колоните на набор от данни, така че всички редове да имат еднакъв брой колони.
Machine Translated by Google
Петият раздел ви показва как да създавате shell скриптове, които съдържат bash
команди, които се изпълняват последователно.
КОМАНДАТА JOIN
100 Обувки
200 връзки
300 чорапи
КОМАНДАТА ЗА СГЪВАНЕ
aa bb cc defghij kk
ll m
m nn
Бързата кафява
лисица прескача
КОМАНДАТА НА РАЗДЕЛЯНЕТО
Командата split е полезна, когато искате да създадете набор от подфайлове на даден файл. По
подразбиране подфайловете са именувани и xzz. Така xaa, xab, …, xaz, xba, xbb, …, xbz,
по подразбиране за командата за разделяне създава максимум 676 … xza, xzb, … файла (=26x26). Размерът
Ако файлът abc.txt съдържа между 501 и 1000 реда, тогава предходната команда ще
създаде следната двойка файлове:
xaa
xab
Можете също така да посочите файлов префикс за създадените файлове, както е показано тук:
по-краткоxaa
по-кратъкxab
КОМАНДАТА ЗА СОРТИРАНЕ
аа
вв
bb
аа
bb
вв
•
-n Сортиране по числа (10 ще сортира след 2), игнориране на празни места и
• раздели -r Обръщане на реда на
-rw-r--r-- 1 ocampesato персонал -rw-r--r-- 1 ocampesato 11 април 06 19:21 outfile.txt 12 април 06 19:21
персонал -rwx------ 1 ocampesato персонал 25 април 06 г. output.txt
19:21 apple-care.txt -rwx-- ---- 1 ocampesato staff 146 Apr 06 19:21 checkin-commands.txt -rwx------ 1 ocampesato staff 176 Apr 06
19:21 ssl-instructions.txt -rwx------ 1 ocampesato персонал 417 апр 06 19:43 iphonemeetup.txt
Machine Translated by Google
команда показва дългия списък на файловете в директория, които са сортирани по техния файлов
размер:
ls -l | сортиране -k 5
Резултатът е тук:
общо 72 -rw-r--
r-- 1 ocampesato staff 12 април 06 20:46 output.txt -rw-r--r-- 1 ocampesato staff 14 април 06 20:46 outfile.txt -rwx---- --
1 персонал на ocampesato 25 април 06 20:46 apple-care.txt -rwxr-xr-x 1 персонал на ocampesato 90 април 06 20:50
testvars.sh -rwxr-xr-x 1 персонал на ocampesato 100 април 06 20:50 testvars2 .sh -rwx------ 1 ocampesato staff 146 Apr 06
20:46 checkin-commands.txt -rwx------ 1 ocampesato staff 176 Apr 06 20:46 ssl-instructions.txt -rwx-- ---- 1 ocampesato
staff 417 6 април 20:46 iphonemeetup.txt
Забележете, че списъкът с файлове е сортиран въз основа на петата колона, която показва
размера на всеки файл. Можете да сортирате файловете в директория и да ги показвате от най-
големия до най-малкия с тази команда:
ls -l | сортиране -n
сортирайте abc2.txt
Седмият ред
Шестият ред
Това е първи ред
Това е първи ред
Това е ред три
Това е втори ред
Както можете да видите, предходният изход съдържа два дублиращи се реда. Следващият
разделът ви показва как да използвате командата uniq за премахване на дублиращи се редове.
УНИКАЛНАТА КОМАНДА
Командата uniq отпечатва само уникалните редове в сортиран текстов файл (т.е. игнорира
дублиращи се редове). Като прост пример, да предположим, че файлът test3.txt съдържа
следния текст:
абв
деф
абв
абв
абВ
ГДЕ
Командата diff ви позволява да сравнявате два текстови файла, а командата сравнява cmp
два двоични файла. Да предположим например, че файлът
Machine Translated by Google
Здравейте
Свят
сбогом свят
е показано тук:
1,2c1,2
< Здравейте
< Свят
---
Обърнете внимание, че командата diff извършва чувствително към малки и главни букви текстово сравнение,
КОМАНДАТА OD
Командата od показва осмичен дъмп на файл, който може да бъде много полезен, когато искате да видите
вградени контролни знаци (като символи за табулация), които обикновено не се виждат на екрана. Тази команда
съдържа много превключватели, които можете да видите, когато въведете man od.
Като прост пример, да предположим, че файлът tabs.txt съдържа един ред текст
със следните три букви, разделени с табулатор (който не се вижда тук) между всяка
двойка букви:
а b °С
котка -t abc.txt
a^Ib^Ic
В глава 1 научихте, че командата echo отпечатва знак за нов ред, докато командата
printf не отпечатва знак за нов ред (освен ако не е изрично включен). Можете сами да
проверите този факт с този кодов фрагмент:
0000005
°С де
КОМАНДАТА TR
Следващият пример замества новия ред във всеки ред с празно място,
което произвежда един ред изход:
'
cat test4.txt |tr '\n' '
Следващият пример премахва знака за нов ред в края на всеки ред текст в текстов
файл. Като илюстрация листинг 3.3 показва съдържанието на
abc2.txt.
Machine Translated by Google
Това е първи ред Това е втори ред Това е трети ред Четвърти ред Пети ред Шести ред Седми ред
Както можете да видите, в резултата липсва празно място между последователните редове,
които можем да вмъкнем с тази команда:
Това е първи ред Това е втори ред Това е трети ред Четвърти ред Пети ред Шести ред Седми ред
Това е първи ред. Това е втори ред. Това е трети ред. Четвърти ред. Пети ред. Шести ред. Седми ред.
Можете също така да комбинирате множество команди, като използвате символа „тръба“ на
bash. Например, следната команда сортира съдържанието на листинг 3.3, извлича „долните“ пет
реда текст, извлича редовете текст, които са уникални, и след това преобразува текста в главни
букви,
СЕДМИЯТ РЕД
ШЕСТИЯТ РЕД
ТОВА Е ПЪРВИ РЕД
ТОВА Е ТРЕТИ РЕД
ТОВА Е ВТОРИ РЕД
Можете също така да конвертирате първата буква на дума в главна (или в малка)
с командата tr , както е показано тук:
x="пица" x=`echo
${x:0:1} | tr '[az]' '[AZ]''${x:1}` echo $x
Малко по-дълъг (един допълнителен ред код) начин за преобразуване на първата буква в
главни букви са показани тук:
x="pizza"
first=`echo $x|cut -c1|tr [az] [AZ]` second=`echo $x|cut -c2-` echo
$first$second
IDN,ТЕСТ,WEEK_MINUS1,WEEK0,WEEK1,WEEK2,WEEK3,WEEK4,WEEK10,
WEEK12,WEEK14,WEEK15,WEEK17,WEEK18,WEEK19,WEEK21
^M1,BASO,,1.4,,0.8,,1.2,,1.1,,, 2.2,,,1.4^M1,BASOAB,,0-
.05,,0.04,,0.05,,0.04,,,0.07,,,0.05^M1,EOS,,6.1,,6.2,,7.5,, 6.6,,
,7.0,,,6.2^M1,EOSAB,,0.22,,0.30,,0.27,,0.25,,,0.22,,,0 .21^M1,HCT,,35.0,,34.2,,34.6,,34.3,,
,36.2,,,34.1^M1,HGB,,11 .8,,11.1,,11.6,,11.5,,,12.1,,,11.3^M1,LYM,,36.7
inputfile="controlm.csv"
removectrlmfile="removectrlmfile" tr -s '\r' '\n' < $inputfile >
$removectrlmfile
IDN,ТЕСТ,WEEK_MINUS1,WEEK0,WEEK1,WEEK2,WEEK3,WEEK4,WEEK10,
WEEK12,WEEK14,WEEK15,WEEK17,WEEK18,WEEK19,WEEK21
1,BASO,,1.4,,0.8,,1.2,,1.1,,,2.2 ,,,1.4
1,BASOAB,,0.05,,0.04,,0.05,,0.04,,,0.07,,,0.05 1,EOS,,6.1,,6.2,,7.5,,6.6,,,7.0,,,6.2
1,EOSAB,,0,22,,0,30,,0,27,,0,25,,,0,22,,,0,21
Както можете да видите, задачата в този раздел се решава лесно чрез командата tr .
Обърнете внимание, че в предходния изход има празни полета, което означава, че е
необходима допълнителна обработка.
Можете също така да замените текущия разделител „,“ с различен разделител, напр
като „|“ символ, който се появява в следната команда:
IDN|ТЕСТ|WEEK_MINUS1|WEEK0|WEEK1|WEEK2|WEEK3|WEEK4|WEEK10|
СЕДМИЦА12|СЕДМИЦА14|СЕДМИЦА15|СЕДМИЦА17|СЕДМИЦА18|СЕДМИЦА19|СЕДМИЦА21
Machine Translated by Google
1|BASO|1.4|0.8|1.2|1.1|2.2|1.4 1|BASOAB|0.05|0.04|
0.05|0.04|0.07|0.05 1|EOS|6.1|6.2|7.5|6.6|7.0|6.2 1|EOSAB|0.22 |
0,30|0,27|0,25|0,22|0,21
Ако имате текстов файл с множество разделители в произволен ред в множество файлове,
можете да замените тези разделители с един разделител чрез командата sed , която е разгледана в
глава 6.
КОМАНДАТА ЗА НАМИРАНЕ
Можете също така да посочите времена за достъп, отнасящи се до файловете. Например atime, ctime и
mtime се отнасят съответно до времето за достъп, времето за създаване и времето за модификация на файл.
Като друг пример, следната команда намира всички файлове, променени за по-малко от 2 дни и отпечатва
броя на записите за всеки:
ЗАБЕЛЕЖКА Бъдете внимателни, когато премахвате файлове. Изпълнете предходната команда без exec
rm {} , за да прегледате списъка с файлове, преди да ги изтриете.
КОМАНДАТА TEE
Предходният кодов фрагмент пренасочва списъка с всички файлове в текущата директория (и тези
във всички поддиректории) към командата xargs , която след това търси и отпечатва всички редове, които
завършват с низа „sh“. Резултатът се показва на екрана и също се пренасочва към файла /tmp/blue.
КОМАНДАТА НА ТАР
apple-care.txt checkin-
commands.txt iphonemeetup.txt outfile.txt
output.txt ssl-instructions.txt
Предходната команда показва същия изход като командата ls -l , която показва дълъг
списък.
Опцията „z“ използва gzip компресия. Например следната команда създава
компресиран файл, наречен testing.tar.gz:
КОМАНДАТА CPIO
Командата cpio осигурява допълнително компресиране, след като създадете tar файл.
Например следната команда създава файла archive.cpio:
Опцията „-o“ указва изходен файл, а опцията „-v“ указва „подробно“, което означава,
че файловете се показват, както са поставени в архивния файл. Опцията „-I“ указва „вход“,
а опцията „-d“ указва „дисплей“.
файл1
файл2
файл3 1
блок
Можете да създадете gzip tarballs (т.е. tar файл, използвайки gzip компресия), като
използвате следните
методи: Метод #1:
Метод #2:
Командата bunzip2
Командата zip
Командата zip е друга помощна програма за създаване на zip файлове. Например, ако имате файловете,
наречени file1, file2 и file3, тогава следната команда създава файла file1.zip , който съдържа тези три файла:
zip файл?
ls test.gz zcat
test.gz
Друг набор от помощни програми за bz файлове включва bzcat, bzcmp, bzdiff, bzegrep,
bzfgrep, bzgrep, bzless и bzmore.
Прочетете онлайн документацията, за да научите повече за тези команди.
данни="възраст,пол,улица,щат"
IFS=$',' за
елемент в $data do echo
Артикул: възраст
Артикул: пол
Артикул: ул
Артикул: състояние
Имайте предвид, че можете също да използвате командата awk (обсъдена в глава 7), за
да произведете същия изход.
Следващият раздел съдържа примерен код, който разчита на стойността на IFS до
извличане на данни правилно от набор от данни.
#23456789012345678901234567890
1000 Джейн Едуардс
2000 Том Смит
3000 Дейв Дел Рей
# емпид: 03-09
Machine Translated by Google
inputfile="datacolumns1.txt"
ехо "--------------"
fi
Списък 3.7 задава стойността на IFS на празен низ, който е необходим, за да работи
коректно този скрипт на обвивката (опитайте да стартирате този скрипт без настройка
на IFS и вижте какво ще се случи). Тялото на този скрипт съдържа цикъл while , който
чете всеки ред от входния файл, наречен datacolumns1.txt , и задава променливата на
паунда равна на „v“, ако редът не започва със знака „#“ ИЛИ задава променливата на
паунда равна на целият ред, ако започва със знака „#“. Това е проста техника за
филтриране на линии въз основа на първоначалния им характер.
Операторът if се изпълнява за редове, които не започват със знак „#“, а променливите empid, fname и lname се инициализират
съответно със знаците в колони от 3 до 9, след това от 11 до 19 и след това от 21 до 29. Стойностите на тези три променливи се отпечатват
всеки път, когато се инициализират. Както можете да видите, тези променливи се инициализират чрез комбинация от командата echo и
командата cut и стойността на IFS е необходима, за да се гарантира, че командата echo не премахва празни интервали.
Име: Смит
--------------
линия: 3000 empid: Дейв Дел Рей
3000 fname: Dave
lname: Del Ray
--------------
inputfile="uneven.txt"
outputfile="even2.txt"
Листинг 3.9 съдържа две техники за повторно подравняване на текста във входния
файл, така че изходът да се появява с четири колони във всеки ред. Както можете да видите,
и двете техники включват командата
xargs (което е интересно използване на командата). xargs
РЕЗЮМЕ
Тази глава ви показа примери за това как да използвате някои полезни и многофункционални bash
команди. Първо научихте за bash командите join, fold, split, sort и uniq. След това научихте за командата find
и командата. Освен това научихте за различни начини за използване на командата tr , която също xargs
След това видяхте някои команди, свързани с компресията, като cpio и tar, които ви
помагат да създавате нови компресирани файлове и също така ви помагат да изследвате
съдържанието на компресираните файлове.
Освен това научихте как да извличате диапазони от колони от данни, както и
полезността на опцията IFS .
Machine Translated by Google
ГЛАВА 4
T
неговата глава ви запознава с операторите (за числови данни и низ
променливи), условна логика (if/else/fi) и няколко вида цикли (for, while и until) в
bash.
Първата част на тази глава ви показва как да извършвате аритметични
операции и операторите, които са налични за това. Ще видите също как да
присвоявате стойности на променливи и след това как да четете въведеното от
потребителя в скрипт на обвивка.
Втората част от тази глава ви показва как да използвате командата test за
променливи, файлове и директории (като например определяне дали две
променливи са равни). Ще научите как да използвате различни релационни, булеви
и низови оператори.
Третият раздел въвежда условна логика (if/else/fi), операторът за превключване
case/esac , заедно с цикли for , вложени цикли for , цикли while и цикли until . Ще
научите също как да дефинирате свои собствени персонализирани функции в шел
скриптове.
Последният раздел ви показва как да работите с масиви в bash, което включва
примери за повторение на елементи от масив и актуализиране на техните
съдържание.
• Аритметични оператори •
Стрингови оператори
• Файлови тестови
оператори • Булеви оператори
Някои оператори, свързани с файлове, които са налични в bash, включват -f, -d, -e за проверка
дали името на файл е съответно файл, директория или проверка за съществуването на файл.
да проверите дали два операнда са равни, и !=, за да проверите дали два операнда са неравни.
ехо "$(($num1+$num2))"
num1=3
num2=5
x=`echo "$(($num1+$num2))"`
Командата expr
Сумата: 4
x="abc" expr
Аритметични оператори
х=15
y=4
sum=`expr $x + $y`
Machine Translated by Google
[ $x == $y ] връща false [ $x != $y ]
връща true
[ ! false ] е вярно.
Логическите условия и другите тестове обикновено се поставят в квадратни скоби []. Имайте предвид,
че има интервал между квадратните скоби и операндите. Ще покаже грешка, ако не е предоставено място.
[$var -eq 0]
Командата test извършва проверки на условия и намалява броя на скобите. Същият набор от тестови
условия, затворени в [] , може да се използва за тестовата команда, както е показано тук:
РАБОТА С ПРОМЕНЛИВИ
x="abc"
y="123" echo
"x = $x и y = ${y}" echo "xy = $x$y" echo "двойни и
единични кавички: $x" '$x'
z = "abc"
$y=3
-bash: =3: командата не е открита
#length of myvar:
myvar=123456789101112 echo ${#myvar}
b=7
c=$((a+b)) echo "a:
$ab: $bc: $c"
15
01112
123456789101112
6789101112
999456789101112 a: 5 b: 7 c:
12
Например следният кодов фрагмент чете два знака от командния ред (под формата
на въвеждане от потребителя) и след това показва тези два знака:
четене -s вар
Има различни оператори в bash за тестване на низови променливи и комбиниране на тези оператори с булеви оператори. Да
предположим, че променливите x и y
[ $x = $y ] [$x != е
$y ] [ -z $x ]
•
-n s1 Низът s1 има ненулева дължина. -z s1
•
Низът s1 има нулева дължина.
Можем да открием по-малкия или по-големия низ по азбучен ред, както следва:
[[ $str1 > $str2 ]]: true, когато str1 е по-голям от по азбучен ред
str2
[[ $str1 < $str2 ]]: вярно, когато str1 е по-малък по азбучен ред от str2
[[ -z $str1 ]]: вярно, ако str1 съдържа празен низ,
[[ -n $str1 ]]: вярно, ако str1 съдържа непразен низ
фи
Machine Translated by Google
"
str1="Не е празен str2="" ако
[[ -n $str1 ]]
&& [[ -z $str2 ]]; тогава echo str1 не е празен и str2 е празен низ.
фи
OLDDIR=`pwd` cd /
tmp
CURRDIR=`pwd` echo
"текуща директория: $CURRDIR" mydir="/tmp/abc/def" mkdir -p $mydir && cd $mydir &&
echo "сега в $mydir" newdir=`pwd` echo "нова директория: $newdir" echo "нова директория:
`pwd`" cd $OLDDIR
echo "текуща директория: `pwd`"
На този етап сте запознати с всички bash команди в предходния кодов блок. Опитайте
се да предвидите изхода, преди да стартирате предходния кодов блок. (Бяхте ли прав?)
fpath="/etc/passwd"
if [ -e $fpath ]; тогава
echo Файлът съществува;
друго
ехо Не съществува;
фи
записва" else
if [ then ! -e $fpath ]
echo
фи
if [ -e $fpath -a -w $fpath ]
x=25 if
[ $x -lt 30 ] then echo "x е по-
малко
от 30"
Machine Translated by Google
друго
echo "x е поне 30"
фи
x="abc"
Листинг 4.2 инициализира променливата x със стойността abc и след това използва конструкцията if/
X е дефинирано: abc
Листинг 4.3 показва съдържанието на шел скрипта testvars2.sh , който проверява дали променливата
е недефиниран.
г
if [ -z "$y" ] тогава
y="def" echo
"y е дефинирано: $y" else echo "y е
дефинирано: $y" fi
Листинг 4.3 първо проверява дали променливата y е дефинирана и тъй като тя не е дефинирана,
y="def" echo
"y е дефинирано: $y"
Machine Translated by Google
y е дефинирано: def
СЛУЧАЙЪТ/ИЗЯВЛЕНИЕ НА ESAC
x="abc"
case $x in a)
echo "x е a" ;; c) ехо "x е c" ;; a*)
echo "x започва с a" ;; *) echo
"няма съвпадения" ;;
esac
x започва с a
Листинг 4.5 ви показва как да подканите потребителите за входен низ и след това
да обработите този вход чрез оператор case/esac .
"
echo -n "Моля, въведете първото си име: прочетете fname
Machine Translated by Google
"
echo -n "Моля, въведете вашето фамилно име: прочетете lname
случай $city в
San*) echo "$fullname живее в Калифорния " ;;
Чикаго) echo "$fullname живее във Ветровития град " *) echo "$fname живее в ;;
ла-ла земя " ;;
esac
Списък 4.5 започва с подкана към потребителите за тяхното име, фамилия и град
и след това присвояване на тези стойности съответно на променливите fname, lname
и city . След това променливата fullname се дефинира като конкатенация на стойностите
на fname и lname.
Следващата част от листинг 4.5 е ключовата дума case , която проверява дали
променливата city започва с низа San или дали променливата city е равна на Chicago.
Третата опция е опцията по подразбиране, която е вярна, ако и двете предходни
условия са неверни.
Списък 4.6 показва съдържанието на StartChar.sh , който проверява типа на първия
знак на низ, предоставен от потребителя.
esac
Свършен
Списък 4.6 започва с подкана към потребителите за низ и след това инициализира
променлива var с този входен низ.
Следващата част от листинг 4.6 е ключовата дума case , която проверява дали
променливата var започва с 0 или повече цифри, главни букви или малки букви
Machine Translated by Google
Списък 4.7 започва с цикъл while , чието съдържание е идентично със съдържанието
на листинг 4.6 (можете да прочетете предходния раздел за обяснение на кода).
Единствената разлика е, че този примерен код се повтаря безкрайно и можете да
натиснете ctrl-c , за да прекратите изпълнението на скрипта на обвивката.
Списък 4.8 показва съдържанието на StartChar3.sh , който проверява типа на първия
знак на низ, предоставен от потребителя.
случай ${var:0:1} в
[0-9]*) echo "$var започва с цифра" ;; [[:upper:]]) echo "$var започва с главна
буква" ;; [[:lower:]]) echo "$var започва с малка буква" ;; echo "$var започва с друг символ" ;; *)
esac
Свършен
Списък 4.8 също започва с цикъл while , който съдържа оператор case/esac . В този
пример обаче условията включват нула или повече
Machine Translated by Google
цифри, главни букви и малки букви. В допълнение, този примерен код също се
повтаря безкрайно и можете да натиснете ctrl-c, за да прекратите изпълнението на
скрипта на обвивката.
x="abcdefghij" echo $
{x:0} echo ${x:1}
echo ${x:5} echo
${x:7:3}
abcdefghij
bcdefghij fghij
hij
abcdefghij ghij
ghij
РАБОТА С ЦИКЛИ
за f в `ls *txt`
do
echo "file: $f" done
Резултатът от предходния for цикъл зависи от файловете със суфикс txt , които са
в директорията, където стартирате for цикъла (ако няма такива файлове, тогава for
цикълът не прави нищо).
Листинг 4.10 показва съдържанието на renamefiles.sh2 , което илюстрира как
за преименуване на набор от файлове в директория.
newsuffix="txt"
за f в `ls *sh`
do
base='echo $f |cut -d"." -f1' суфикс='echo $f |cut -d"." -f2'
newfile="${base}.${newsuffix}"
Machine Translated by Google
Примерният код в този раздел съдържа for цикъл, който проверява за различни
свойства на файловете в текущата директория.
Листинг 4.11 показва съдържанието на checkdir.sh , което отчита броя на
директориите, изпълними файлове, четими файлове и ASCII файлове в текущата
директория.
#!/bin/bash #
инициализиране на променливи „брояч“ TOTAL_FILES=0
ASCII_FILES=0
NONASCII_FILES=0
READABLE_FILES=0 EXEC_FILES=0
ДИРЕКТОРИИ=0
за f в „ls“.
направи
Machine Translated by Google
TOTAL_FILES=`израз $TOTAL_FILES + 1`
ако [ -d $f ] тогава
ДИРЕКТОРИ=`expr $ДИРЕКТОРИИ + 1` fi
ако [ -x $f ] тогава
EXEC_FILES=`израз $EXEC_FILES + 1`
фи
ако [ -r $f ] тогава
READABLE_FILES=`израз $READABLE_FILES + 1`
фи
ASCII_FILES=`израз $ASCII_FILES + 1`
else
#echo "четливо: $четливо"
NONASCII_FILES=`expr $NONASCII_FILES + 1` fi
Свършен
# резултати: echo
TOTAL_FILES: 33
ДИРЕКТОРИИ: 1
Machine Translated by Google
EXEC_FILES: 26
ASCII_FILES: 29
НЕ-ASCII_ФАЙЛОВЕ: 4
#!/bin/bash
outermax=10
символа[0]="#"
символа[1]="@"
Можете лесно да обобщите този код: ако масивът от символи съдържа arrlength
елементи, тогава заменете предходния кодов фрагмент със следния:
@#
@@#@
#@#@@#
@#@#@#@#
@#@#@#@#@
#@#@#@@#@#@
#@#@#@#@#@@#@
#@#@#@#@@#@#@
#@@#@
x=0
тогава
прекъсвам
фи
Свършен
ново x: 1 x
=1
х=2
х=3
х=4
infile="wordfile.txt"
outfile="converted.txt" rm -f $outfile
2>/dev/null
Следващата част от листинг 4.14 е цикъл while , който обработва ред по ред във
входния файл. След това променливата wordcount се инициализира като броя на
думите в текущия ред, а променливата modvalue се инициализира на половината от
стойността на wordcount.
Следващата част от листинг 4.14 е условен блок, който проверява дали modvalue
е четно или нечетно. Ако modvalue е четен, текущият ред се преобразува в главни
букви и след това се добавя към изходния файл. Ако modvalue е странно, текущият ред
се преобразува в малки букви и се добавя към изходния файл.
абВГДЕ
деф
ABC GHI
абв
while(true) do echo -n
case $response in
Machine Translated by Google
esac
else
Свършен
Списък 4.16 съдържа цикъл while , който подканва потребителите да въведат главна или малка
буква Y или главна или малка буква n. Входната стойност се присвоява на променливата. Следващата
част от листинг 4.16 е оператор отговор.
case/esac , който съдържа регулярни изрази, които присвояват една от стойностите false, true или
unknown на променливата continue.
Следващата част от листинг 4.16 съдържа кодов блок if/elif/else/fi , който отпечатва подходящо
съобщение, което зависи от стойността на променливата
продължете.
до команда do
команди
Свършен
Machine Translated by Google
Списък 4.17 илюстрира как да използвате цикъл unless за преминаване през набор от числа.
x="0" до
[ "$x" = "5" ] do x=`expr $x + 1` echo "x:
$x"
done
Листинг 4.17 инициализира променливата x със стойност 0 и след това влиза в цикъл до . Тялото
на цикъла увеличава x и отпечатва стойността му, докато x стане равно на 5, в който момент цикълът
прекратява изпълнението. Стартирайте кода в листинг 4.17 и ще видите следния резултат:
х: 1
х: 2
х: 3
x: 4 x:
5
Bash shell предоставя вградени функции и също така ви позволява да дефинирате свои собствени
функции, което означава, че можете да дефинирате персонализирани функции, които са специфични
за вашите нужди. Ето прости правила за дефиниране на функция в shell скрипт:
Следният кодов блок дефинира много проста персонализирана функция, която съдържа
командата echo :
Здравейте()
{
Machine Translated by Google
Здравейте
Здравейте()
{
echo "Здравей, $1, как си"
}
Изпълнете модифицираната функция и също така задайте низ, както е показано тук:
Здравей Боб
Здравейте()
{
if [ "$1" != "" ] then echo "Hello
$1" else
Здравейте
Machine Translated by Google
Здравейте()
{
докато [ "$1" != "" ] правете echo "hello
$1"
shift
Свършен
Здравей abc
здравей а
здравей б
здравей c
DataFile="users.txt"
addUser() {
"
echo -n "Собствено име:
прочетете fname
"
echo -n "Фамилия: прочетете lname
ехо ""
echo "Списък с потребители"
echo "==============" cat users.txt 2>/
dev/null
ехо "-----------------------------"
echo "Въведете 'a', за да добавите нов потребител" echo
"Въведете 'd', за да изтриете всички потребители"
echo "Въведете 'x', за да излезете от това меню"
ехо "-----------------------------"
ехо
esac
Свършен
Примерно извикване на листинг 4.18 е тук, което вече е добавило трима потребители:
Списък на потребителите
==============
абВГДЕ
123 456 888
777
----------------------------
МАСИВИ В BASH
Списък 4.19 дефинира масива с имена , който се инициализира с пет низа, започвайки
от индекс 0 до индекс 4. Двата оператора за ехо показват първия и втория елемент в
масива с имена , които са съответно с индекс 0 и 1. Резултатът от листинг 4.19 е тук: