本文為Linux Shell Scripting Tutorial (LSST) v2.0學(xué)習(xí)記錄
第一章
本章節(jié)學(xué)習(xí)任務(wù):
- 了解什么是shell腳本
- 了解Linux kernel, shell, bash and scripting basic
1.1 Linux是什么
Linux是一個(gè)基于Unix的開源操作系統(tǒng),Linus Torvalds是其開發(fā)者,同時(shí)也得到了世界上很多開發(fā)者的幫助正卧,他的特性包括但不限于:
- 免費(fèi)
- 類Unix系統(tǒng)
- 開源
- 網(wǎng)絡(luò)操作系統(tǒng)
嚴(yán)格意義上來(lái)說(shuō)柠新,Linux是一個(gè)kernel(內(nèi)核)炉擅,kernel提供了對(duì)計(jì)算機(jī)硬件和資源的訪問(wèn)與操作:
- 文件和數(shù)據(jù)
- 運(yùn)行中的程序
- 加載程序到內(nèi)存
- 網(wǎng)絡(luò)
- 安全和防火墻
- 赂苗。帆离。独榴。等等
但是一個(gè)系統(tǒng)只有kernels是不夠的僧叉,日常的使用需求還要求系統(tǒng)攜帶文本編輯器、郵件客戶端棺榔、瀏覽器瓶堕、辦公應(yīng)用等;所以就有了基于Linux kernel并整合了多種工具的Linux發(fā)行版症歇,一般來(lái)說(shuō)郎笆,發(fā)行版需要具有以下的特征:
- Linux kernel
- GUN應(yīng)用
- 圖形使用界面
- 辦公應(yīng)用
- 軟件開發(fā)工具和編譯器
- 充足的可使用的軟件包
- Linux 安裝程序(腳本)
- Linux管理工具(例如增加使用者,安裝軟件等)
- 一個(gè)整合了這些特性的shell
有些公司在使用Linux的時(shí)候需要技術(shù)支持忘晤,就催生了一些公司例如 Red Hat 和 Novell 等公司發(fā)行收費(fèi)的Linux發(fā)行版并提供技術(shù)支持宛蚓,當(dāng)然開源社區(qū)也有完全免費(fèi)的產(chǎn)品例如Debian 和 Gentoo等。目前世界上有超過(guò)200種Linux發(fā)行版设塔。
1.2 誰(shuí)創(chuàng)建了Linux
1991年凄吏,Linus Torvalds在大學(xué)期間接觸到了UNIX,他當(dāng)時(shí)使用的是一個(gè)適用于科研的Unix版本(Minix)闰蛔,但是Minix有著不少缺陷痕钢,于是他就開發(fā)了他自己的"Minix",也就是后來(lái)的Linux钞护,Linux的開源也就是從這個(gè)時(shí)候開始的盖喷。
Linux是Linus開發(fā)的kernel,Linux與GUN項(xiàng)目中的系統(tǒng)程序與庫(kù)綁定在一起难咕,創(chuàng)造了一個(gè)可用性很高的操作系統(tǒng)课梳。有時(shí)候大家會(huì)把Linux說(shuō)成GUN/Linux是因?yàn)長(zhǎng)inux是直接整合的GUN項(xiàng)目距辆,另外需要知道的是,Linus Torvalds是Linux kernel的創(chuàng)作者暮刃,而不是Linux系統(tǒng)的擁有者[1]
Linux 發(fā)布版 = Linux kernel + GUN 系統(tǒng)實(shí)用程序和庫(kù) + 安裝腳本 + 管理程序
另外需要注意的是跨算,Linux目前有很多發(fā)行版,以適應(yīng)服務(wù)器椭懊、桌面诸蚕、工作站等一系列的需求。
額外鏈接:
Linus Torvalds profile at Google+
Linus's Blog (not updated anymore)
1.3 在哪里下載Linux
通過(guò)網(wǎng)絡(luò)進(jìn)行下載是最方便的氧猬,以下是推薦的數(shù)款發(fā)布版本(下列不予翻譯):
- Fedora Linux - Fedora is a distribution of Linux based on Red Hat linux, developed by the Fedora Project. Fedora is good for both desktop and laptop usage including sys admins.
- CentOS Linux - CentOS is a community-supported, mainly free software operating system based on Red Hat Enterprise Linux. CentOS is good for server usage.
- Debian Linux - Debian focuses on stability and security and is used as a base for many other distributions such as Ubuntu. Debian stable is good for server usage.
- Ubuntu Linux - Ubuntu originally based on the Debian Linux distribution. Ubuntu is designed primarily for desktop usage, though netbook and server editions exist as well.
- OpenSuse Linux - openSUSE is a general purpose Linux distribution and sponsored by Novell. However, it is quite popular on Laptop and desktop usage.
- Slackware Linux - It was one of the earliest operating systems to be built on top of the Linux kernel and is the oldest currently being maintained. Slackware is pretty popular among the hardcore Linux users and sys admins.
- Linux Mint Linux - Linux Mint provides an up-to-date, stable operating system for the average user, with a strong focus on usability and ease of installation.
- PCLinuxOS Linux - PCLinuxOS comes with KDE Plasma Desktop as its default user interface. It is a primarily free software operating system for personal computers aimed at ease of use.
- Mandriva Linux - Mandriva Linux is a French Linux distribution distributed by Mandriva. It uses the RPM Package Manager.
- Sabayon Linux - Sabayon is based upon Gentoo Linux and it follows the OOTB (Out of the Box) philosophy, having the goal to give the user a wide number of applications ready to use and a self-configured operating system.
- Arch Linux - Arch Linux is a Linux distribution intended to be lightweight and simple. The design approach of the development team focuses on simplicity, elegance, code correctness and minimalism.
- Gentoo Linux - Gentoo Linux is a computer operating system built on top of the Linux kernel and based on the Portage package management system.
1.4 如何安裝Linux
- Fedora 26: Installation Guide - Installing Fedora Linux version 26 on x86, AMD64, and Intel 64 architectures.
- Red Hat Enterprise Linux 7: Installation Guide - Installing Red Hat Enterprise Linux version 7 for all architectures.
- Debian GNU/Linux stable - Installation Guide. Also, contains pointers and information on how to make the most of your new Debian system. There is a quick video tutorial/demo available too.
- Ubuntu Installation Guide - This chapter provides a quick overview of installing Ubuntu 16.04 LTS Server Edition.
- Slackware installation guide - There is a quick help available at the official website.
- Linux mint user guide - Linux Mint provides user guides to guide you through the installation and the usage of the desktop.
- OpenSuse installation guide - This site hosts documentation for openSUSE Leap and related projects including installation and sysadmin topics.
- Arch Linux installation guide - This document is a guide for installing Arch Linux from the live system booted with the official installation image.
1.5 什么是Linux Kernel
kernel是Linux操作系統(tǒng)的核心背犯,每個(gè)Linux發(fā)行版都會(huì)包括兩個(gè)部分:
- Linux kernel
- Linux shell
kernel的作用包括文件管理、多任務(wù)處理盅抚、內(nèi)存管理漠魏、輸入輸出設(shè)備管理、進(jìn)程管理妄均、設(shè)備管理柱锹、網(wǎng)絡(luò)管理(包括ipv4和ipv6)以及一系列更加深入的功能。kernel決定誰(shuí)會(huì)使用這些資源已經(jīng)什么時(shí)候用丰包,用多久禁熏。
1.6 什么是Linux Shell
計(jì)算機(jī)能夠理解的語(yǔ)言為二進(jìn)制語(yǔ)言(binary language),早期我們都是使用二進(jìn)制語(yǔ)言進(jìn)行操控電腦邑彪,但是對(duì)我們而言很難閱讀及理解瞧毙。因此,在一個(gè)操作系統(tǒng)內(nèi)有一個(gè)特別的程序叫做shell锌蓄,shell接受人類可以輕易理解的指令并將其轉(zhuǎn)化為kernel可以讀入和處理的語(yǔ)言升筏。
Shell是什么
- shell是一個(gè)面對(duì)用戶的程序,或者說(shuō)它是提供給用戶的交互環(huán)境
- 它是一個(gè)解釋器瘸爽,從標(biāo)準(zhǔn)輸入設(shè)備例如鍵盤?或者文件讀入指令并執(zhí)行
- shell在用戶登入或者打開終端的時(shí)候啟動(dòng)
- 執(zhí)行系統(tǒng)程序快捷和簡(jiǎn)單的方法
- shell不是kernel的一部分您访,但是調(diào)用系統(tǒng)kernel執(zhí)行程序
- 現(xiàn)在 Linux中可用的shell包括:
- BASH ( Bourne-Again SHell ) :在Linux中最常見(jiàn)的shell,是開源的
- CSH (C SHell):C shell的語(yǔ)法和使用非常類似C編程語(yǔ)言
- KSH (Korn SHell) :由AT & T Bell Labs的David Korn建立. Korn Shell 同時(shí)也是POSIX Shell標(biāo)準(zhǔn)技術(shù)規(guī)范的基礎(chǔ)
- TCSH:Berkeley UNIX C shell (CSH)的增強(qiáng)版剪决,并與CSH兼容
注意:所有的shell做的都是同一種工作灵汪,只是理解不一樣的語(yǔ)法和提供不一樣的內(nèi)建功能,微軟開發(fā)的 MS-DOS(Microsoft Disk Operating System)叫做 COMMAND.COM柑潦, 行使的是和shell一樣的功能享言,只不過(guò)還不是那么強(qiáng)大
命令提示符 (Shell Prompt)
有多種方式可以操作shell:
- 終端:桌面版Linux一般都會(huì)提供一個(gè)基于登陸系統(tǒng)的圖形用戶界面,一旦登陸就可以通過(guò)XTerm/GTerm/KTerm等應(yīng)用操作shell
- 通過(guò)secure shell:一旦登錄遠(yuǎn)端服務(wù)器或者工作站就會(huì)得到一個(gè)命令提示符
- 通過(guò)console:有些Linux提供基于文件的登陸系統(tǒng)渗鬼,一般來(lái)說(shuō)在登陸以后同樣會(huì)得到一個(gè)命令提示符
如何知道我現(xiàn)在有哪些shell
執(zhí)行以下的命令即可完成:
new@Chevy-PC:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
/usr/bin/tmux
/usr/bin/screen
多個(gè)結(jié)果意味著你的Linux支持多個(gè)shell
命令行界面 (Command Line Interface, CLI)
shell提供了連接Linux的界面览露,你可以通過(guò)鍵盤或者其他輸入設(shè)備完成操作,shell同時(shí)也可以成為命令行界面 (Command Line Interface)譬胎, 發(fā)現(xiàn)現(xiàn)在使用的shell可以通過(guò)使用以下命令:
new@Chevy-PC:~$ echo $SHELL
/bin/bash
new@Chevy-PC:~$ ps $$
PID TTY STAT TIME COMMAND
4 tty1 S 0:00 -bash
new@Chevy-PC:~$ ps -p $$
PID TTY TIME CMD
4 tty1 00:00:00 bash
這就說(shuō)明我目前使用的是bash shell
基本的命令行操作
你可以使用以下的組合鍵去編輯和撤銷命令:
- CTRL + L : 清理當(dāng)前屏幕.
- CTRL + W : 清理光標(biāo)所在處的單詞
- CTRL + U : 清理全行命令
- Up鍵和Down鍵 : 回溯之前/之后的命令 (command history).
- Tab : 自動(dòng)補(bǔ)全命令/目錄名等等
- CTRL + R : 搜索命令記錄 (command history)
- CTRL + C : 終止當(dāng)前命令
- CTRL + T : 交換光標(biāo)前的最后兩個(gè)字符
- ESC + T : 交換光標(biāo)前的最后兩個(gè)單詞
- CTRL + H : 刪除從光標(biāo)處開始的字母
執(zhí)行一個(gè)命令
簡(jiǎn)單的鍵入你的命令然后回車即可差牛,例如date
命令可以查看當(dāng)前的時(shí)間命锄, man data
命令可以查看date
命令的使用文檔,info date
可以查看date
命令的信息文檔偏化,同時(shí)常見(jiàn)的命令都會(huì)有-h / --help
參數(shù)用以展示幫助選項(xiàng):
new@Chevy-PC:~$ date
Thu Jul 11 10:35:03 DST 2019
new@Chevy-PC:~$ man date
DATE(1) User Commands DATE(1)
NAME
date - print or set the system date and time
SYNOPSIS
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
DESCRIPTION
Display the current time in the given FORMAT, or set the system date.
Mandatory arguments to long options are mandatory for short options too.
-d, --date=STRING
display time described by STRING, not 'now'
--debug
annotate the parsed date, and warn about questionable usage to stderr
-f, --file=DATEFILE
like --date; once for each line of DATEFILE
-I[FMT], --iso-8601[=FMT]
output date/time in ISO 8601 format. FMT='date' for date only (the default), 'hours',
'minutes', 'seconds', or 'ns' for date and time to the indicated precision. Example:
2006-08-14T02:34:56-06:00
Manual page date(1) line 1 (press h for help or q to quit)
new@Chevy-PC:~$ info date
Next: arch invocation, Up: System context
21.1 ‘date’: Print or set system date and time
==============================================
Synopses:
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [ MMDDhhmm[[CC]YY][.ss] ]
Invoking ‘date’ with no FORMAT argument is equivalent to invoking it
with a default format that depends on the ‘LC_TIME’ locale category. In
the default C locale, this format is ‘'+%a %b %e %H:%M:%S %Z %Y'’, so
the output looks like ‘Thu Mar 3 13:47:51 PST 2005’.
Normally, ‘date’ uses the time zone rules indicated by the ‘TZ’
environment variable, or the system default rules if ‘TZ’ is not set.
*Note Specifying the Time Zone with ‘TZ’: (libc)TZ Variable.
If given an argument that starts with a ‘+’, ‘date’ prints the
current date and time (or the date and time specified by the ‘--date’
option, see below) in the format defined by that argument, which is
similar to that of the ‘strftime’ function. Except for conversion
specifiers, which start with ‘%’, characters in the format string are
printed unchanged. The conversion specifiers are described below.
An exit status of zero indicates success, and a nonzero value
-----Info: (coreutils)date invocation, 40 lines --Top-----------------------------------------------------Welcome to Info version 6.5. Type H for help, h for tutorial.
1.7 UNIX的哲學(xué)
Unix哲學(xué)是基于Unix操作系統(tǒng)主要開發(fā)人員的經(jīng)驗(yàn)開發(fā)軟件的哲學(xué)方法脐恩,下面的哲學(xué)方法也適用于Linux操作系統(tǒng):
- Do one thing and do it well - Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.
- Everything is file - Ease of use and security is offered by treating hardware as a file.
- Small is beautiful.
- Store data and configuration in flat text files - Text file is a universal interface. Easy to create, backup and move to another system.
- Use shell scripts to increase leverage and portability - Use shell script to automate common tasks across various UNIX / Linux installations.
- Chain programs together to complete complex task - Use shell pipes and filters to chain small utilities that perform one task at time.
- Choose portability over efficiency.
- Keep it Simple, Stupid (KISS).
額外鏈接:
1.8 什么 是shell腳本
一般來(lái)說(shuō),shell是交互性的 侦讨,也就是說(shuō)你輸入命令驶冒,shell接受并執(zhí)行,返回結(jié)果韵卤。但是骗污,如果你儲(chǔ)存一系列的命令在一個(gè)文本文件里面然后執(zhí)行,這也就是shell程序(shell program)或者稱為shell腳本(shell script)
每個(gè)shell腳本都會(huì)包括一下幾個(gè)部分:
- Shell kewwords 例如if...else語(yǔ)句怜俐, do...while語(yǔ)句
- Shell commands 例如pwd, test, echo, continue, type等命令
- Linux binary commands 例如w, who, free, etc等
- 文本處理程序例如grep, awk, cut等
- 函數(shù)可以將多個(gè)操作整合進(jìn)一個(gè)函數(shù)
- 控制流例如if...then...else或者shell loop去執(zhí)行重復(fù)的操作
每個(gè)腳本都有一個(gè)目的
- 特殊目的:備份數(shù)據(jù)或者上傳數(shù)據(jù)庫(kù)(例如每隔一段時(shí)間執(zhí)行某個(gè)腳本將將數(shù)據(jù)重新備份)
- 執(zhí)行命令:每個(gè)shell腳本就像一條條命令那樣被簡(jiǎn)單執(zhí)行(使用腳本處理某個(gè)數(shù)據(jù))
- 腳本代碼利用:Shell腳本可以從現(xiàn)有腳本擴(kuò)展身堡。此外,還可以使用函數(shù)文件來(lái)打包經(jīng)常使用的任務(wù)
1.9 為什么使用shell腳本
當(dāng)你在終端不停執(zhí)行重復(fù)命令的時(shí)候拍鲤,shell腳本就顯得很有用
特性:
- shell腳本可以從命令行或者文件讀入數(shù)據(jù)參數(shù),然后將結(jié)果返回到屏幕
- 當(dāng)你在重復(fù)執(zhí)行同一個(gè)任務(wù)的時(shí)候汞扎,你就應(yīng)該使用shell腳本來(lái)減少你的工作量
- 創(chuàng)建自己的實(shí)用工具
- 自動(dòng)化的輸入或者輸出
- 定制管理任務(wù)
- 因?yàn)槟_本的重復(fù)性及經(jīng)過(guò)測(cè)試季稳,所以會(huì)減少犯錯(cuò)的幾率
常見(jiàn)的應(yīng)用場(chǎng)景:
- 管理你的Linux系統(tǒng)
- 數(shù)據(jù)備份和創(chuàng)建快照
- 轉(zhuǎn)儲(chǔ)Oracle或者M(jìn)ySQL數(shù)據(jù)庫(kù)進(jìn)行備份
- 創(chuàng)建基于電子郵件的警報(bào)系統(tǒng)
- 找出什么程序吃掉了你部分的系統(tǒng)資源
- 找出可用的內(nèi)存
- 找i出所有登陸的用戶以及他們?cè)谧鍪裁?/li>
- 找出所有失敗的登陸記錄,如果同一個(gè)IP在重復(fù)嘗試失敗的登錄澈魄,通過(guò)防火墻封掉該IP
- 根據(jù)你的安全策略進(jìn)行用戶管理
- 找出本地或者遠(yuǎn)程服務(wù)器的信息
- 配置服務(wù)器
優(yōu)勢(shì):
- 使用簡(jiǎn)單
- 快速啟動(dòng)
- 節(jié)約時(shí)間
- 系統(tǒng)管理任務(wù)自動(dòng)化
- Shell腳本可以在幾乎任何現(xiàn)代UNIX / Linux / BSD / Mac OS X操作系統(tǒng)上執(zhí)行景鼠,因?yàn)樗鼈兪怯媒忉屨Z(yǔ)言編寫的
劣勢(shì):
- 不同平臺(tái)間會(huì)出現(xiàn)比較復(fù)雜的問(wèn)題
- 運(yùn)行速度緩慢
- 每一個(gè)shell命令都會(huì)開啟一個(gè)新進(jìn)程
本教程使用那種shell?
Bash shell
學(xué)習(xí)目標(biāo)
完成本次課程以后痹扇,你可以學(xué)到:
- 理解Linux shell編程的基礎(chǔ)
- 自行編寫自動(dòng)化的腳本
- 自定義shell啟動(dòng)文件
- 創(chuàng)建漂亮的實(shí)用程序
- 控制你的管理任務(wù)铛漓,如Linux用戶管理,Linux系統(tǒng)監(jiān)控等
本章節(jié)復(fù)習(xí)題
- 什么是shell
徐爺?shù)幕卮穑阂环N交互環(huán)境鲫构,充當(dāng)用戶和kernel之間的解釋
- 寫下一個(gè)命令浓恶,列出終端下的文件
ls
- 寫下一個(gè)命令,以逆創(chuàng)建時(shí)間的順序列出所有以'.perl'結(jié)尾的文件信息
ls -r *.perl
- 寫下一個(gè)命令结笨,列出你在運(yùn)行的程序
ps -aux | grep youranme
or top -u yourname
- 寫下一個(gè)命令包晰,列出待打印的文件
lpq
需要安裝軟件
- 寫下一個(gè)命令,刪除3個(gè)文件分別叫做 file1.txt, file2.txt, and data1.txt
rm file1.txt file2.txt data1.txt
- 寫下一個(gè)命令炕吸,在/tmp文件夾下創(chuàng)建一個(gè)子目錄foo
mkdir -p /tmp/foo
- 寫下一個(gè)命令伐憾,刪除剛剛創(chuàng)建的目錄
rmdir /tmp/foo
- 寫下一個(gè)命令,列出
ls
命令所有的選項(xiàng)
man ls
or man ls