生產力工具:shell 與 Bash 腳本

生產力工具:shell 與 Bash 腳本

做者:吳甜甜
我的博客網站: wutiantian.github.io
注意:本文只是我我的總結的學習筆記,不適合0基礎人士觀看。python


參考內容:linux

王頂老師 linux bash 視頻教程git

http://billie66.github.io/TLCL/book程序員

C語言編程網: http://c.biancheng.net/shell/github

推薦書籍:《UNIX環境編程》,有內容,有遠離,課後習題也很棒。web


目錄正則表達式

我爲何學 shell

我首先接觸到 shell 是在深圳的一家fpga的方案公司參觀交流時,看到工程師對fpga進行編程時,敲幾個字符就插入了代碼塊,感受很快,是生產力的決勝武器。工程師告訴我,每一個 fpga 公司都有本身的核心技術專利,編寫好的私有庫就是經過幾個字符的腳本插入到程序中,每家都不一樣,模塊不對外公開。算法

我意識到,成爲具備核心價值的工程師必須掌握這項技能!shell

我本科時學的是電子信息工程,對軟件的態度並無什麼都要會的意識,只是用到再學。但對於 shell ,它並不能迫在眉睫能解決什麼必須處理的問題,卻成爲人與人差距的重要一環之一。express

寫本內容時,是應用於圖像機器學習中遇到實際問題寫的我的筆記。當我準備用手頭的《Linux程序設計》書時,很失望,看着塊頭挺大。內容可看的很少。網上的博客大多數內容比較淺,實戰性不強。因此我本身寫給本身複習。

嵌入式的shell是精簡過的,語法略有不一樣,這點要注意。好比說數組,部分命令的輸出和PC尚的存在必定差別。

什麼是 shell 與 BASH

  • shell:
    一說到命令行,咱們真正指的是 shell。
    shell 就是一個程序,它接受從鍵盤輸入的命令, 而後把命令傳遞給操做系統去執行。

  • BASH
    「bash」 是 「Bourne Again SHell」 的首字母縮寫。
    bash 是由 Steve Bourne 的人寫成 shell 程序的加強版

由於基於「命令行」界面,而不是「圖形」界面,因此 shell 與 bash 的適應性更強,能應用在多種系統中,是「通殺」的技能。

學 shell 與 BASH 立竿見影的好處

經常使用功能例舉 功能簡述 優點 功能
1 自動運行命令行 自動執行多組操做 添加一條命令行,每次輸入幾個字符(打開bash)時都會自動運行
2 alias別名 簡化單組操做字符數

三步編寫執行一個 Shell 腳本

步驟 內容 詳細
1 編寫一個腳本。 shell 腳本就是普通的文本文件。因此咱們須要一個文本編輯器來書寫它們。最好的文本 編輯器都會支持語法高亮,這樣咱們就可以看到一個腳本關鍵字的彩色編碼視圖。語法高亮會幫助咱們查看某種常見 錯誤。爲了編寫腳本文件,vim,gedit,kate,和許多其它編輯器均可以。
2 使腳本文件可執行 系統會至關挑剔不容許任何舊的文本文件被看做是一個程序,而且有充分的理由! 因此咱們須要設置腳本文件的權限來容許其可執行。
3 把腳本放置到 shell 可以找到當前目錄下 當沒有指定可執行文件明確的路徑名時,shell 會自動地搜索某些目錄, 來查找此可執行文件。爲了最大程度的方便,咱們會把腳本放到這些目錄當中。

命令

命令提示符與命令的概念簡述

  • 命令提示符:說明 shell已經準備好輸入了

[當前用戶登陸名@linux主機名 當前路徑]$

例如: [Teenie@wutiantian.github.io ~]$
表示:當前用戶Teenie在主機名爲wutiantian.github.io的當前路徑爲家目錄

注意,後續的「定製 shell 環境」章節 有具體更改成本身心中環境的設置過程。

  • 命令行語法

command -options arguments
命令 一個或多個選項 一個或多個參數對象

以「空格」分隔,無論幾個空格都算一個空格。

例如: ls -l /usr

  • 如何選擇命令行發揮更大優點
界面 優點
圖形 簡單的任務更簡單
命令行 複雜的任務成爲可能

命令的詳細

選項 options 分爲 短選項和長選項,功能效果同樣

options 舉例 優點 描述
short -a 效率高 格式爲'-'單橫槓
短選項可合併。若'-'後不止一個字母則爲合併選項。
例如:-a與-l合併爲-al所有列出功能
long --all 更直觀 格式爲'--'雙橫槓
長選項沒有合併說法。
命令 四種形式
execute binary
可執行二進制
就像咱們所看到的位於目錄/usr/bin 中的文件同樣 用諸如 C 和 C++語言寫成的程序編譯二進制文件, 也能夠是由諸如shell,perl,python,ruby等等腳本語言寫成的程序
buildin bash
內嵌bash命令
bash 支持若干命令,內部叫作 shell 內部命令 (builtins) 例如,cd 命令,就是一個 shell 內部命令。
shell function 函數 這些是小規模的 shell 腳本 它們混合到環境變量中。
alias 命令別名 定義本身的命令 創建在其它命令之上
命令 檢測命令的四種形式歸屬 舉例 舉例
type Indicate how a command name is interpreted
說明怎樣解釋一個命令名
type command
四種命令形式的哪種
#type type
type is a shell builtin
#type ls
ls is aliased to `ls --color=auto'
#type cp
cp is /bin/cp
which To determine the exact location of a given executable, the which command is used:
顯示可執行程序的位置
which command
一個操做系統中,不僅安裝了可執行程序的一個版本,爲了肯定所給定的執行程序的準確位置,使用 which 命令
這個命令只對可執行程序有效
#which cp
/bin/cp
#which cd
使用 shell 內建命令時,得不到迴應。
help 獲得shell 內建命令的(簡要)幫助文檔 command --help
help command
幫助文件多是中文也多是英文
help cd
cd --help
man 詳細用戶幫助 man command man ls | less
apropos 基於某個關鍵字的搜索匹配項,很粗糙但有時頗有用 apropos command
等價於man -k
whatis The whatis program displays the name and a one line description of a man page matching a specified
顯示匹配特定關鍵字手冊頁的名字和一行命令說明
whatis command whatis ls
ls(1)- list directory contents
info info 內容可經過 info 閱讀器 程序讀取。info 頁是超級連接形式的,和網頁很類似,退出就消失了痕跡
info 文件包含超級連接,它可讓你從一個結點跳到另外一個結點。一個超連接可經過 它開頭的星號來辨別出來,把光標放在它上面並按下 enter 鍵,就能夠激活它
info command info ls

help cd

長說明

cd: cd [-L|[-P [-e]] [-@]] [dir]
    Change the shell working directory.
    
    Change the current directory to DIR.  The default DIR is the value of the
    HOME shell variable.
    
    The variable CDPATH defines the search path for the directory containing
    DIR.  Alternative directory names in CDPATH are separated by a colon (:).
    A null directory name is the same as the current directory.  If DIR begins
    with a slash (/), then CDPATH is not used.
    
    If the directory is not found, and the shell option `cdable_vars' is set,
    the word is assumed to be  a variable name.  If that variable has a value,
    its value is used for DIR.
    
    Options:
        -L  force symbolic links to be followed: resolve symbolic links in
        DIR after processing instances of `..'
        -P  use the physical directory structure without following symbolic
        links: resolve symbolic links in DIR before processing instances
        of `..'
        -e  if the -P option is supplied, and the current working directory
        cannot be determined successfully, exit with a non-zero status
        -@  on systems that support it, present a file with extended attributes
            as a directory containing the file attributes
    
    The default is to follow symbolic links, as if `-L' were specified.
    `..' is processed by removing the immediately previous pathname component
    back to a slash or the beginning of DIR.
    
    Exit Status:
    Returns 0 if the directory is changed, and if $PWD is set successfully when
    -P is used; non-zero otherwise.

cd --help

短說明

bash: cd: --: invalid option
cd: usage: cd [-L|[-P [-e]] [-@]] [dir]

apropos ls

匹配關鍵字
等價於man -k ls

SSL (3ssl)           - OpenSSL SSL/TLS library
_llseek (2)          - reposition read/write file offset
aconnect (1)         - ALSA sequencer connection manager
add-shell (8)        - add shells to the list of valid login shells
afInitChannels (3)   - initialize audio data format for a track in an audio f...
afOpenFile (3)       - open an audio file and create a file handle structure ...
afs_syscall (2)      - unimplemented system calls
afSetVirtualChannels (3) - set the virtual data format for a track in an audi...
afSetVirtualSampleFormat (3) - set the virtual data format for a track in an ...
alsabat (1)          - command-line sound tester for ALSA sound card driver
alsactl (1)          - advanced controls for ALSA soundcard driver
alsactl_init (7)     - alsa control management - initialization
alsaloop (1)         - command-line PCM loopback
alsamixer (1)        - soundcard mixer for ALSA soundcard driver, with ncurse...
amidi (1)            - read from and write to ALSA RawMIDI ports
amixer (1)           - command-line mixer for ALSA soundcard driver
aplay (1)            - command-line sound recorder and player for ALSA soundc...
...

linux系統基礎操做

linux思想:一切皆文件

顏色屬性 淺藍 紅色閃爍
文件類型 普通文件 目錄 連接文件 可執行文件 壓縮文件 連接有問題文件 設備文件 其餘文件
解析例如:
檔案類型權限 連節數 檔案擁有者  檔案所屬羣組  文件大小  檔案最後被修改時間  檔名
-rw-r--r--  1      Teenie       Teenie     3803     6月  24 21:43     .bashrc

文件類型標記方法:
|首位|類型|舉例|文件舉例|
|---|---|---|---|
|-|普通文件|文本文件、二進制文件|a.c , 1.txt , a.out , test1.sh ,bbbb.txt-hard看不出類型的文本硬連接|
|d|文件夾||cache/|
|l|符號連接文件|後面會用->打印出它指向的文件|ln -s src.c linker.c
linker.c就是src.c的一個符號連接文件
lrwxrwxrwx 1 root root 3 .... linker.c -> src.c|
|s|socket文件||
|p|管道文件|||

文件權限 含義
r 可讀
w 可寫
x 可執行
- 空權限,沒有權限
不可執行Permission denied
文件目錄結構 內容
bin 存儲二進制可執行命令文件(綠色)
root root超級用戶,即根用戶的主目錄
home 普通用戶的默認家目錄,每一個普通用戶擁有一個以用戶名命名的文件夾
mnt 可移除設備掛載點。例如:光驅。共享文件夾目錄/mnt/ghfs/
media 可移除設備
etc 配置文件和目錄
/etc/crontab寫腳本或定時運行一些任務,有定時設置。
/etc/fstab系統掛載的磁盤ID
/etc/passwd全部用戶的帳號密碼
proc 操做系統正在運行進程的文件列表。可用「file 文件名」去查看用途
lib 存儲各類程序所須要的共享庫文件
opt optional可選的,第三方軟件可安裝至此
boot 存放ubuntu內核和系統啓動文件
/boot/grub/grub.conf or menu.lst,被用來配置啓動加載程序。
/boot/vmlinuz,Linux 內核
var 用於存放不少不斷變化的文件,例如日誌文件等。
/var/log 目錄包含日誌文件、各類系統活動的記錄。
這些文件很是重要,而且 應該時時監測它們。
tmp 存儲系統和用戶的臨時信息
user 包括與系統用戶直接有關的文件和目錄
sbin 系統命令的存儲位置
  • linux文件存儲

至少包括兩部分,(1)文件數據自己(2)文件原數據
原數據包括:文件屬性(建立時間、修改時間、全部者、權限、文件名)。
這些原數據連接到了數據塊自己,因此自己就是一個硬連接
當硬連接數量比1少時,文件就被刪除了。

類型 硬連接 軟連接
侷限性 不能指向到目錄
有 ln file link無ln directory link
文件和連接文件不能位於不一樣設備
符號連接:連接、原文件。刪除連接,原文件不受影響。
刪除原文件則連接文件指向空,野指針,在操做系統有紅色顯示
外觀 硬連接在ls命令下是看不出區別的。 符號連接課看出符號指向
sbin->usr/sbin

探索操做系統狀態

date

顯示系統當前時間和日期
This command displays the current time and date.

2019年 06月 30日 星期日 18:21:15 CST

cal

顯示當前月份的日曆
A related command is cal which, by default, displays a calendar of the current month.

六月 2019         
日 一 二 三 四 五 六  
                   1  
 2  3  4  5  6  7  8  
 9 10 11 12 13 14 15  
16 17 18 19 20 21 22  
23 24 25 26 27 28 29  
30

exit

結束終端會話

We can end a terminal session by either closing the terminal emulator window, or by entering the exit command at the shell prompt:

file filename

肯定文件類型

file ~/.bashrc

/home/Teenie/.bashrc: ASCII text

linux文件系統跳轉

命令 全英文 用法
pwd Print name of current working directory
打印出當前工做的絕對路徑
pwd 我是誰?我在哪?
ls List directory contents
列出目錄內容
ls
什麼都不跟,查看當前目錄資料
ls /dev
查看指定路徑下資料
cd Change directory
更改目錄
cd
什麼都不跟,回到家目錄
cd ~username
回到某用戶家目錄
cd -
切換到前一個操做目錄
cd Teenie/
切換到指定路徑下目錄

[Teenie@wutiantian.github.io ~]$ pwd

/home/Teenie
普通用戶根目錄的工做目錄名:在home目錄下的該用戶名地址下。

ls

經常使用選項 長選項 做用 舉例
-a --all 列出目錄下的全部內容,包括隱藏的
-d --directory 該目錄自己的信息(單)行 ls -ld /usr
drwxr-xr-x. 13 root root 155 6月 30 03:28 /usr
-F --classify 文件或者目錄名字後加一個字符的分類標識 /目錄,例如opt/; @連接,例如 bin@
-h --human-readable 可讀模式 容量4096轉爲4.0k,
避免太大數字不能直觀看出多大
-l long長格式輸出
-r --reverse 反序,字母降序排列文件夾
-t --time 按修改日期排序

cd Teenie/

切換到當前路徑下的Teenie文件夾目錄路徑下
在幾乎全部的狀況下,你能夠省略」./」。它是隱含的

To change your working directory (where we are standing in our tree-shaped maze) we use the cd command. To do this, type cd followed by the pathname of the desired working directory. A pathname is the route we take along the branches of the tree to get to the directory we want. Pathnames can be specified in one of two different ways; as absolute pathnames or as relative pathnames. Let’s deal with absolute pathnames first.
|路徑的兩種方式|特徵|
|---|---|
|相對路徑|用一對特殊符號來表示相對位置:符號 「.」 指的是工做目錄,」..」 指的是工做目錄的父目錄|
|絕對路徑|根目錄開頭的「/」開始,直到它的目的地|

cd ..

切換到上一級目錄

操做文件和目錄

命令 含義 示例
mkdir make directory mkdir dir1
mkdir dir1 dir2 dir3
cp copy cp item1 item2 把單個文件item1複製成item2
cp item... directory 複製多個item文件/文件夾到directory文件夾
mv move 移動、重命名文件
rm remove -i交互諮詢;
-r遞歸;
-f,--force ;
-v,--verbose,explain what is being done。
rm file1
默默地刪除文件
rm -i file1
除了在刪除文件以前,提示用戶確認信息以外,和上面的命令做用同樣。
rm -r file1 dir1
刪除文件 file1, 目錄 dir1,及 dir1 中的內容。
rm -rf file1 dir1
除了若是文件 file1,或目錄 dir1 不存在的話,rm 仍會繼續執行。
ln link ln file link建立硬連接;
ln bbb.txt bbb.txt-hard
ln -s item link建立符號連接
ln -s fun fun-sym

附:item 表示文件或目錄

cp /etc/passwd .

將用戶帳戶密碼拷貝至當前目錄

cp -v /etc/passwd .

"/etc/passwd"->"./passwd"
顯示操做過程

cp -i /etc/passwd .

cp:是否覆蓋"./passwd"?

cp a passwd dir1

將a與passwd文件,複製到dir1文件夾中

cp短選項 長選項 意義
-a --archive 複製文件和目錄,以及它們的屬性,包括全部權和權限。 一般,副本具備用戶所操做文件的默認屬性。
-i --interactive 重寫已存在文件以前,提示用戶確認。若是這個選項不指定, cp 命令會默認重寫文件。
-r --recursive 遞歸地複製目錄及目錄中的內容。當複製目錄時, 須要這個選項(或者-a 選項)。
-u --update 當把文件從一個目錄複製到另外一個目錄時,僅複製目標目錄中不存在的文件,或者是文件內容新於目標目錄中已經存在的文件。
-v --verbose 顯示翔實的命令操做信息
mv短選項 長選項 意義
-i --interactive 在重寫一個已經存在的文件以前,提示用戶確認信息。 若是不指定這個選項,mv 命令會默認重寫文件內容。
-u --update 當把文件從一個目錄移動另外一個目錄時,只是移動不存在的文件, 或者文件內容新於目標目錄相對應文件的內容。
-v --verbose 當操做 mv 命令時,顯示翔實的操做信息。

文本處理

文本處理用處:文檔、網頁、電子郵件、打印輸出、程序源代碼

  • 排序
排序命令 功能
cat 鏈接文件而且打印到標準輸出
sort 給文本行排序,結果發送到標準輸出
uniq 報告或者省略重複行
cat選項 功能
-A 打印文本文檔中的非打印字符
-n number增長行號在文本中
-s 合併多餘空行。3個連續空行變爲1個
非打印字符 名稱 顯示效果
enter 回車鍵 $
tab 製表鍵 ^I
space 空格

cat -A hello.c

打印 hello.c 文本文檔中的非打印字符,讓人更明瞭程序排版

#include<stdio.h>$
int main(void)$
{$
    printf("hello world");$
    return 0;$
 } $

sort 程序對標準輸入的內容,或命令行中指定的一個或多個文件進行排序,而後把排序 結果發送到標準輸出。

使用與 cat 命令相同的技巧,咱們可以演示如何用 sort 程序來處理標準輸入

sort >foo.txt 
c
a
b

Ctrl-d 組合鍵來表示文件的結尾

cat foo.txt 
a
b
c
看到文本行有序地顯示

sort 程序能接受命令行中的多個文件做爲參數,因此有可能把多個文件合併成一個有序的文件。

例如, 若是咱們有三個文本文件,想要把它們合併爲一個有序的文件。

sort file1.txt file2.txt file3.txt > final_sorted_list.txt

sort 程序選項 長選項 功能
-b --ignore-leading-blanks 默認狀況下,對整行進行排序,從每行的第一個字符開始。這個選項致使 sort 程序忽略 每行開頭的空格,從第一個非空白字符開始排序。
-f --ignore-case 讓排序不區分大小寫。
-n --numeric-sort 基於字符串的數值來排序。使用此選項容許根據數字值執行排序,而不是字母值。
-r --reverse 按相反順序排序。結果按照降序排列,而不是升序。
-k --key=field1[,field2]
偏量
根據字段排序
-m --merge 把每一個參數看做是一個預先排好序的文件。把多個文件合併成一個排好序的文件,而沒有執行額外的排序。
-o --output=file 把排好序的輸出結果發送到文件,而不是標準輸出。
-t --field-separator=char 定義域分隔字符。默認狀況下,域由空格或製表符分隔。

du -s /usr/share/* |sort -nr |head

查看磁盤中目錄,哪一個文件夾佔用磁盤空間大,數字逆序排列前十個

245984  /usr/share/fonts
122532  /usr/share/icons
114424  /usr/share/doc
89328   /usr/share/help
82640   /usr/share/libreoffice
60556   /usr/share/pyzy
55588   /usr/share/app-install
42228   /usr/share/mythes
41496   /usr/share/fcitx-sogoupinyin
39692   /usr/share/man
uniq 選項 功能
-c 輸出全部的重複行,而且每行開頭顯示重複的次數。
-d 只輸出重複行,而不是特有的文本行。
-f n 忽略每行開頭的 n 個字段,字段之間由空格分隔,正如 sort 程序中的空格分隔符;然而, 不一樣於 sort 程序,uniq 沒有選項來設置備用的字段分隔符。
-i 在比較文本行的時候忽略大小寫。
-s n 跳過(忽略)每行開頭的 n 個字符。
-u 只輸出獨有的文本行。這是默認的。
  • 切片
命令 功能 例子
cut 裁剪,從文件裏取東西 cut -f 2,2 linux-by-date.txt >linux-vernums.txt
paste 合併文件文本行
經過讀取多個文件,而後把每一個文件中的字段整合成單個文本流,輸入到標準輸出。
paste linux-dates.txt linux-names.txt >linux-key-names.txt
join 往文件里加東西 join linux-key-names.txt linux-key-vernums.txt
  • 比較
查看差別命令 功能 例子
comm 逐行比較兩個有序的文件
compare
diff 逐行比較文件或目錄
different
如何把文件1編程文件2
patch 把更改應用到原始文檔中去 diff -Naur old_file new_file >patchfile.txt
patch < patchfile.txt


diff三種模式 模式內容 示例
normal 描述要求更改的位置和類型
context 上下文模式。信息有冗餘 -刪除行
+增長行
!更改行
unin 統一模式 空格:兩個文件都包含這一行
-:在第一個文件中刪除這一行
+:添加這一行到第一個文件中
cat file1.txt
a
b
c
d

cat file2.txt
b
c
d
e

comm file1.txt file2.txt
a
            b
            c
            d
    e
1特  2特  共有

comm -12 file1.txt file2.txt
b
c
d
隱藏12列

diff file1.txt file2.txt           
1d0     如何把file1改爲file2.txt?
< a     刪除d第一行的a
4a4     把第2個文件的第4行
> e     加上e

diff -c file1.txt file2.txt
context模式
*** file1.txt
--- file2.txt
*************
*** 1,4 *****
-a
 b
 c
 d
--- 1,4 -----
 b
 c
 d
+e

diff -u file1.txt file2.txt
unin 統一模式
---file1.txt
+++file2.txt
@@-1,4,+1,4@@
-a
 b
 c
 d
+e
  • 運行時編輯

The tr program is used to transliterate characters.

tr 程序被用來更改字符。咱們能夠把它看做是一種基於字符的查找和替換操做。

命令 功能 例子
tr search/replace查找與替換 tr char_set1 char_set2
在第一個字符集裏查找,替換成第2個字符集內容
charset三種模式 內容
list枚舉 abcdefghijklmnop
field域 a-z or A-Z or 0-9
POSIX [:lower:][:upper:]

中止

中止的快捷鍵 功能 例子
ctrl+z 將任務停止(暫停的意思),可是此任務並無結束。
他仍然在進程中他只是維持掛起的狀態,
用戶能夠使用fg/bg操做繼續前臺或後臺的任務,
fg命令從新啓動前臺被中斷的任務,
bg命令把被中斷的任務放在後臺執行.
當你vi一個文件是,若是須要用shell執行別的操做,
可是你又不打算關閉vi,
由於你得存盤退出,
你能夠簡單的按下ctrl+z,
shell會將vi進程掛起,
當你結束了那個shell操做以後,
你能夠用fg命令繼續vi你的文件。
ctrl+c 強制中斷程序的執行,進程已經終止
ctrl+d 不是發送信號,而是表示一個特殊的二進制值,表示 EOF。
在shell中,ctrl-d表示退出當前shell

權限

Linux 系統有多用戶性能。

爲了使多用戶特性付諸實踐,那麼必須發明一種方法來阻止用戶彼此之間受到影響。

畢竟,一個用戶的行爲不能致使計算機崩潰,也不能亂動屬於另外一個用戶的文件。

命令 詳解 示例
id Display user identity
顯示當前用戶身份
#id
chmod Change a file’s mode
更改已經存在的文件模式
支持兩種不一樣的方法來改變文件模式:八進制數字表示法或 符號表示法。
umask Set the default file permissions
設置默認的新建立文件權限
umask 0002
默認權限減2
chown Change a file’s owner
更改文件全部者
chgrp Change a file’s group ownership
更改文件組全部權
su Run a shell as another user
以另外一個用戶的身份來運行 shell
sudo Execute a command as another user
以另外一個用戶的身份來執行命令
passwd Change a user’s password
更改用戶密碼
passwd [user]

在 Unix 術語中,每一個人 是指整個世界。能夠用 id 命令,來找到關於你本身身份的信息

id
uid=1000(teenie) gid=1000(teenie) groups=1000(teenie),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)

id組的字符 含義
u g o a
owner
user
group other all=user+group+other

uid 從1000開始變號

屬性 文件(直觀) 目錄(不直觀,需記憶)
r 容許打開並讀取文件內容 容許列出目錄中的內容,
前提是目錄必須設置了可執行屬性(x)
w 容許寫入文件內容或截斷文件。
但不容許對文件進行重命名或刪除,
重命名或刪除是由目錄的屬性決定的
容許在目錄下新建、刪除或重命名文件,
前提是目錄必須設置了可執行屬性(x)
x 容許將文件做爲程序來執行,使用腳本語言編寫的程序必須設置爲可讀才能被執行 容許進入目錄,例如:cd directory

權限的基礎組合值
|Octal|Binary|File Mode|
|---|---|---|---|
|1|001|--x|execute|
|2|010|-w-|write|
|4|100|r--|read|
八進制有8種組合,對以上三種進行組合相加賦值便可。

  • 對於腳本文件,有兩個常見的權限設置
腳本權限值 功能
755 每一個人都能執行
700 只有文件全部者可以執行

注意:爲了可以執行腳本文件,腳本必須是可讀的

chmod

chmod gu=rw foo.txt
組權限賦值

chmod o-x foo.txt
減去other組的x可執行功能

chmod 755 foo.txt
把文件的權限設爲755

軟件安裝管理

軟件包管理工具:系統中,一種安裝和維護軟件的方法

若是咱們花些時間在 Linux 社區裏,咱們會看到不少像Linux發行版中哪個是「最佳」之類的觀點。 這些討論一般很是好笑,集中在一些像桌面背景的漂亮程度(一些人不使用 Ubuntu, 只是由於 Ubuntu 默認主題顏色是棕色的!)和其它的瑣碎東西上。

Linux 發行版本質量最重要的決定因素是軟件包管理系統和其支持社區的持久性。隨着咱們 花更多的時間在 Linux 上,咱們會發現它的變化是很是快的。大多數一線 Linux 發行版每隔六個月發佈一個新版本,而且許多獨立的程序天天都會更新。爲了能和這些 如暴風雪通常多的軟件保持聯繫,咱們須要一些好工具來進行軟件包管理。

選擇 linux 發行版的重要指標:軟件包管理

該發行版是否有
1.好用的軟件包管理系統
2.豐富的軟件包使用
3.持久的社區維護更新

對於早期 linux 用戶,人們需下載和編譯源代碼來安裝軟件。
若是有預先編譯好的軟件包,使用起來相對容易和快速一些

擁有對軟件源代碼的訪問權限是linux的偉大之處,它賦予每一個人定製和優化系統權利。

包管理兩大陣營 發行版(部分列表) 包管理底層工具 包管理上層工具
.deb Debian , Ubuntu dpkg apt-get, aptitude
.rpm Fedora , CentOS , Red Hat , OpenSUSE rpm rpm

以 ubuntu16爲例:

  • 查找安裝

命令 子命令 包名
apt install git

apt 命令首先分析 git 依賴關係,這就是包管理的好處.
若是程序發現缺乏了一個依賴,則會報錯並退出。

Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libllvm5.0 snapd-login-service
Use 'apt autoremove' to remove them.
Suggested packages:
  git-daemon-run | git-daemon-sysvinit git-doc git-el git-email
  git-gui gitk gitweb git-arch git-cvs git-mediawiki git-svn
The following NEW packages will be installed:
  git
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 3,176 kB of archives.
After this operation, 24.1 MB of additional disk space will be used.
Get:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu xenial-updates/main amd64 git amd64 1:2.7.4-0ubuntu1.6 [3,176 kB]
Fetched 3,176 kB in 3s (878 kB/s)
Selecting previously unselected package git.
(Reading database ... 241828 files and directories currently installed.)
Preparing to unpack .../git_1%3a2.7.4-0ubuntu1.6_amd64.deb ...
Unpacking git (1:2.7.4-0ubuntu1.6) ...
Setting up git (1:2.7.4-0ubuntu1.6) ...
  • 卸載

命令 子命令 包名
apt remove git
y

Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  liberror-perl libllvm5.0 snapd-login-service
Use 'apt autoremove' to remove them.
The following packages will be REMOVED:
  git git-core
0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded.
After this operation, 24.1 MB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 242467 files and directories currently installed.)
Removing git-core (1:2.7.4-0ubuntu1.6) ...
Removing git (1:2.7.4-0ubuntu1.6) ...
  • 更新

apt update 更新源

更新已安裝的包
命令 子命令 包名
apt upgrade git

Reading package lists... Done
Building dependency tree       
Reading state information... Done
git is already the newest version (1:2.7.4-0ubuntu1.6).
Calculating upgrade... Done
The following packages were automatically installed and are no longer required:
  libllvm5.0 snapd-login-service
Use 'apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
  • 顯示包信息

知道包名後,要顯示軟件包的詳細信息,例如:版本號、大小、校驗值和軟件描述等信息時。

apt-cache show firefox

Package: firefox
Architecture: amd64
Version: 67.0.4+build1-0ubuntu0.16.04.1
Priority: optional
Section: web
Origin: Ubuntu
...

列出全部已經安裝的軟件包
apt list --installed

Listing... Done
a11y-profile-manager-indicator/xenial,xenial,xenial,now 0.1.10-0ubuntu3 amd64 [installed]
account-plugin-facebook/xenial,xenial,xenial,xenial,xenial,xenial,now 0.12+16.04.20160126-0ubuntu1 all [installed]
...
firefox/xenial-updates,xenial-security,xenial-updates,xenial-security,xenial-security,xenial-updates,now 67.0.4+build1-0ubuntu0.16.04.1 amd64 [installed]
...

PS:aptitude與 apt-get 同樣,是 Debian 及其衍生系統中功能極其強大的包管理工具。

與 apt-get 不一樣的是,aptitude在處理依賴問題上更佳一些。

編譯程序make

編譯就是把源碼(一個由程序員編寫的人類可讀的程序的說明)翻譯成計算機處理器的語言的過程。

ubuntu16 下,編譯一個叫作 diction 的程序,來自 GNU 項目。步驟:

(1)安裝編譯器

sudo apt install ftp gcc

安裝 ftp 與 gcc 兩個文件。

(2)獲取源代碼

ftp ftp.gnu.org

Connected to ftp.gnu.org.
220 GNU FTP server ready.

Name (ftp.gnu.org:root): anonymous


230-NOTICE (Updated October 13 2017):
...
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.


ftp> ls

200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
...
-rw-r--r--    1 0        0            2925 Apr 04 20:15 README
-rw-r--r--    1 0        0          405121 Oct 23  2003 before-2003-08-01.md5sums.asc
-rw-rw-r--    1 0        3003       262986 Jul 05 09:50 find.txt.gz
drwxrwxr-x  320 0        3003        12288 Jun 17 21:54 gnu
drwxrwxr-x    3 0        3003         4096 Mar 10  2011 gnu+linux-distros
-rw-rw-r--    1 0        3003       483088 Jul 05 09:50 ls-lrRt.txt.gz
drwxr-xr-x    3 0        0            4096 Apr 20  2005 mirrors
lrwxrwxrwx    1 0        0              11 Apr 15  2004 non-gnu -> gnu/non-gnu
...
226 Directory send OK.


ftp> cd gnu/dicition

550 Failed to change directory.



ftp> cd gnu/diction

250 Directory successfully changed.


ftp> ls

200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 3003     65534       68940 Aug 28  1998 diction-0.7.tar.gz
-rw-r--r--    1 3003     65534       90957 Mar 04  2002 diction-1.02.tar.gz
-rw-r--r--    1 3003     65534      141062 Sep 17  2007 diction-1.11.tar.gz
-rw-r--r--    1 3003     65534         189 Sep 17  2007 diction-1.11.tar.gz.sig
226 Directory send OK.


ftp> get diction-1.11.tar.gz

local: diction-1.11.tar.gz remote: diction-1.11.tar.gz
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for diction-1.11.tar.gz (141062 bytes).
226 Transfer complete.
141062 bytes received in 1.99 secs (69.1985 kB/s)


ftp> bye

221 Goodbye.
此時根目錄下多了個壓縮包
diction-1.11.tar.gz

解壓縮文件

tar xzf diction-1.11.tar.gz

(3)查看代碼

.c與.h文件

(4)編譯預處理

執行 configure 預處理文件=>產生 makefile腳本文件

./configure

(5)編譯程序

make

執行命令 make 會直接找 makefile=>建立不少 .o 文件

(6)安裝程序

sudo make install

(7)查看程序是否安裝好

which diction
/usr/local/bin/diction

編譯緣由 內容
可用性 有些發行版不包含全部程序
即時性 得到最新版本程序

shell眼中看世界——「展開」

當按下 enter 鍵後,發生在命令行中的一些「魔法」,這種魔法就是展開的過程

字符展開

echo *

打印出當前目錄下的全部文件夾名,不會顯示隱藏文件。

當回車鍵被按下時,shell 在命令被執行前在命令行上自動展開任何符合條件的字符, 因此 echo 命令的實際參數並非」*「,而是它展開後的結果。

路徑名展開

echo /usr/*/share

/usr/kerberos/share  /usr/local/share

通配符所依賴的工做機制叫作路徑名展開。

波浪線展開

波浪線字符(「~」)有特殊的含義。

[Teenie@wutiantian.github.io ~]$ echo ~teenie
/home/teenie

當它用在 一個單詞的開頭時,它會展開成指定用戶的家目錄名,若是沒有指定用戶名,則展開成當前用戶的家目錄

算術表達式展開

shell 在展開中執行算數表達式。看成計算器來使用。

算術表達式展開使用這種格式:

$((expression))

表達式是指算術表達式,它由數值和算術操做符組成。
注意:美圓符號不能丟掉!
例如

echo $((2+2))
4

算術表達式只支持整數(所有是數字,不帶小數點),可是能執行不少不一樣的操做。

操做符 說明
+
-
*
/ 除(可是記住,由於展開只是支持整數除法,因此結果是整數。)
% 取餘,只是簡單的意味着,「餘數」
** 取冪

在算術表達式中空格並不重要,而且表達式能夠嵌套。例如,5的平方乘以3:
注意:嵌套的$與括號切不可少!不然報錯!!!

echo $(($((5**2))*3))
75

echo with $((5%2)) left over.
with 1 left over.

花括號展開

這種模式不能 嵌入空白字符。
花括號展開能夠嵌套。

花括號的模式中 建立多個文本字符串。  
echo Front-{A,B,C}-Back
Front-A-Back Front-B-Back Front-C-Back

echo Number_{1..5}
Number_1 Number_2 Number_3 Number_4 Number_5
使用了一個整數區間

echo {Z..A}
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
倒序排列的字母區間

echo a{A{1,2},B{3,4}}b
aA1b aA2b aB3b aB4b
花括號展開能夠嵌套

參數展開

參數展開特性在 shell 腳本中比直接在命令行中更有用。

存儲小塊數據,並給每塊數據命名的能力有關係。許多像這樣的小塊數據, 更恰當的稱呼應該是變量,可供你方便地檢查它們。

"USER"的變量包含你的用戶名。能夠這樣作來調用參數,並查看 USER 中的內容

echo $USER
teenie

查看有效的變量列表
printenv |less

其它展開類型中,若是你誤輸入一個字符,展開就不會發生

這時 echo 命令只簡單地顯示誤鍵入的模式。

但在參數展開中,若是你拼寫錯了一個變量名, 展開仍然會進行,只是展開的結果是一個空字符串。

命令(展開)替換

命令替換容許咱們把一個命令的輸出做爲一個展開模式來使用

ls -l $(which cp)
-rwxr-xr-x 1 root root 151024 3月   3  2017 /bin/cp
把 which cp 的執行結果做爲一個參數傳遞給 ls 命令,所以能夠在不知道 cp 命令 完整路徑名的狀況下獲得它的文件屬性列表。

file $(ls /usr/bin/* | grep zip)
/usr/bin/funzip:     ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=06412c648a6927c4a14c751fe2412db3425ecd0f, stripped
/usr/bin/gpg-zip:    POSIX shell script, ASCII text executable
...
管道線的輸出結果成爲 file 命令的參數列表

引用-控制展開

shell 提供了一種叫作引用的機制,來有選擇地禁止不須要的展開。

echo this is a    test
this is a test
shell 利用單詞分割刪除掉 echo 命令的參數列表中多餘的空格

echo The total is $100.00
The total is nu00.00

echo The total is $00.00
The total is bash0.00

echo The total is$100.00
The total isnu00.00

由於 1 是沒有定義的變量,參數展開把 $1 的值替換爲 nu

echo the winner is $smith
the winner is

引用-雙引號-限制部分展開

把文本放在雙引號中, shell 使用的特殊字符,都失去它們的特殊含義,被看成普通字符來看待

有幾個例外: $, (反斜槓),和 `(倒引號)。

這意味着單詞分割、路徑名展開、 波浪線展開和花括號展開都將失效,然而參數展開、算術展開和命令替換 仍然執行

使用雙引號,咱們能夠處理包含空格的文件名。

比方說咱們是不幸的 名爲 two words.txt 文件的受害者。
若是咱們試圖在命令行中使用這個 文件,單詞分割機制會致使這個文件名被看做兩個獨自的參數,而不是所指望 的單個參數:
ls -l two words.txt
ls: cannot access two: No such file or directory
ls: cannot access words.txt: No such file or directory

使用雙引號,咱們能夠阻止單詞分割,獲得指望的結果;
進一步,咱們甚至能夠修復 破損的文件名。

ls -l "two words.txt"
-rw-rw-r-- 1 me   me   18 2008-02-20 13:03 two words.txt
 mv "two words.txt" two_words.txt

記住,在雙引號中,參數展開、算術表達式展開和命令替換仍然有效:

echo "$USER$((2+2))"
teenie4

單詞分割機制會在單詞中尋找空格,製表符,和換行符,並把它們看做 單詞之間的界定符。

這意味着無引用的空格,製表符和換行符都不是文本的一部分, 它們只做爲分隔符使用。

echo "this is a    test"
this is a    test

單詞分割被禁止,內嵌的空格也不會被看成界定符,它們成爲參數的一部分。

一旦加上雙引號,咱們的命令行就包含一個帶有一個參數的命令。

單詞分割機制把換行符看做界定符,對命令替換產生了一個雖然微妙但有趣的影響
echo $(cal)
六月 2019 日 一 二 三 四 五 六 1 2  3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

echo "$(cal)"
      六月 2019         
日  一 二 三 四  五 六  
                   1      
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29           
30                    
命令行只有一個參數,參數中包括嵌入的空格和換行符。

引用-單引號-禁止展開

若是須要禁止全部的展開,咱們要使用單引號。如下例子是無引用,雙引號,和單引號的比較結果

echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
text /home/teenie/*.txt a b foo 4 teenie

echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
text ~/*.txt {a,b} foo 4 teenie

echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER

轉義字符

若是沒有準確地理解展開模式,shell 老是神祕和混亂的源泉,而且 shell 潛在的能力也 浪費掉了。

只想引用單個字符。
在字符以前加上一個反斜槓,叫作轉義字符。
常常在雙引號中使用轉義字符,來有選擇地阻止展開

使用轉義字符來消除文件名中一個字符的特殊含義,是很廣泛的。
這些字符包括」$」, 「!」, 「 「等字符。

echo "The balance for user $USER is: \$5.00"
The balance for user teenie is: $5.00
防止美圓符號展開

IO 重定向

IO

」I/O」表明輸入/輸出。標準的輸入爲鍵盤,標準的輸出爲屏幕,而不是保存到磁盤文件。

文件描述符 標準 文件名
0 標準輸入 stdin
1 標準輸出的特殊文件 stdout
2 標準錯誤的文件 stderr
類型輸出
程序運行結果,程序要完成的功能
獲得狀態和錯誤信息, 這些告訴咱們程序進展

經過工具,你能夠重定向命令的輸入輸出,命令的輸入來自文件,而輸出也存到文件

重定向

重定向符號 含義 示例
> 覆蓋內容 清空一個已存在文件的內容或是建立一個新的空文件。
>> 追加內容 不會沖掉之前內容

標準錯誤重定向沒有專用的重定向操做符。爲了重定向標準錯誤,咱們必須參考其文件描述符。
|將錯誤信息輸出到文件操做|說明|
|---|---|
|ls -l /bin/usr 2> ls-error.txt|由於標準錯誤和文件描述符2同樣,咱們用這種 表示法來重定向標準錯誤
文件描述符」2」,緊挨着放在重定向操做符以前,來執行重定向標準錯誤到文件 ls-error.txt 任務。|
|cat ls-error.txt|ls: cannot access '/bin/usr': No such file or directory錯誤信息已經在所指定文件中|

重定向標準輸出和錯誤到同一個文件
|命令|說明|
|---|---|
|ls -l /bin/usr > ls-output.txt 2>&1|首先重定向標準輸出到文件 ls-output.txt,
而後 重定向文件描述符2(標準錯誤)到文件描述符1(標準輸出)使用表示法2>&1。
注意重定向的順序安排很是重要。標準錯誤的重定向必須老是出如今標準輸出 重定向以後,要否則它不起做用。|

處理不須要的輸出/dev/null位存儲桶

ls -l /bin/usr 2> /dev/null

管道操做符|提取數據

  • 多個命令鏈接起來組成一個強大的命令管道
    管道操做符」|」(豎槓),一個命令的標準輸出能夠經過管道送至另外一個命令的標準輸入

command1 | command2

  • 過濾器

管道線常常用來對數據完成複雜的操做。有可能會把幾個命令放在一塊兒組成一個管道線。 一般,以這種方式使用的命令被稱爲過濾器。過濾器接受輸入,以某種方式改變它,而後輸出它。

命令 含義 示例 例子
cat Concatenate files
鏈接文件
cat [file]不分頁顯示 cat < abc.txt 將文件重定向輸入到cat中
sort Sort lines of text
排序文本行
ls /bin /usr/bin | sort | less
由於咱們指定了兩個目錄(/bin 和/usr/bin),ls 命令的輸出結果由有序列表組成, 各自針對一個目錄。經過在管道線中包含 sort,咱們改變輸出數據,從而產生一個 有序列表。
uniq Report or omit repeated lines
報道或省略重複行
ls /bin /usr/bin | sort | uniq | less
uniq 從 sort 命令的輸出結果中,來刪除任何重複行
grep Print lines matching a pattern
打印匹配行
grep pattern [file...] ls /bin /usr/bin | sort | uniq | grep zip
找到文件名中包含單詞」zip」的全部文件
方便的選項:」-i」使得 grep 在執行搜索時忽略大小寫(一般,搜索是大小寫 敏感的),」-v」選項會告訴 grep 只打印不匹配的行。
wc Print newline, word, and byte counts for each file
打印文件中換行符,字,和字節個數
字計數 #wc xy.c
1 1 6 xy.c
xy.c文件中有hello內容,輸出換行符1個,字1個,字節數6個
ls /bin /usr/bin | sort | uniq | wc -l
-l 選項限制命令輸出只能 報道行數
head Output the first part of a file
輸出文件第一部分
默認狀況下,打印十行文本 head -n 5 ls-output.txt
只打印文件前5行
ls /usr/bin | tail -n 5
tail Output the last part of a file
輸出文件最後一部分
默認狀況下,打印十行文本 tail -f /var/log/messages
tail的f選項容許實時地瀏覽文件。當新的內容添加到文件後,它們會當即 出如今屏幕上。這會一直繼續下去直到你輸入 Ctrl-c
tee Read from standard input and write to standard output and files
從標準輸入讀取數據,並同時寫到標準輸出和文件
ls /usr/bin | tee ls.txt | grep zip
在 grep 過濾管道線的內容以前,來捕捉整個目錄列表到文件 ls.txt

比方說咱們下載了一個 大型文件,這個文件被分離成多個部分(USENET 中的多媒體文件常常以這種方式分離), 咱們想把它們連起來

cat movie.mpeg.0* > movie.mpeg

movie.mpeg.001 movie.mpeg.002 … movie.mpeg.099,we could join them back together with this command

正則表達式

用「元字符」實現複雜匹配

  • 學正則表達式,就是學「元字符」,實現複雜的匹配

  • 正則表達式通配符比較類似,但其規模更龐大。

  • 很是靈活,組合使用方法多

正則表達式可應用在不少命令:grep、find、less、vim...

  • 正則表達式是一種符號表示法,被用來識別文本模式。
兩種語法 POSIX 正則表達式 類型 元字符
BRE basic regular expressions 基本正則表達式 ^ $ . [ ] *
ERE Extended Regular Expressions 擴展正則表達式,須要添加-E選項 ( ) { } ? + - | \

元字符和原義字符

字符名 字符 功能
錨點
託字符
^ start 行首
文本行的開頭。插入符號
錨點
美圓符號
$ end 結尾
任意字符 . any char
會匹配在此位置的任意一個字符
中括號表達式 [] 指定 一個待匹配字符集合
不加中括號的狀況下會被解釋爲元字符的字符
一個字符集合可能包含任意多個字符,而且元字符被放置到中括號裏面後會失去了它們的特殊含義
[^]not char set否認字符集裏內容;
限定符 * 0或多匹配次數
( )
限定符 { } 匹配特定個數的元素
要求匹配的最小和最大數目
限定符 ? 0或1匹配次數
限定符
+ 1或多匹配次數
- 表示一個字符範圍
替換符 | alternative
轉義符 \

grep

global regular expression print

咱們能看出 grep 程序和正則表達式有關聯。

本質上,grep 程序會在文本文件中查找一個指定的正則表達式,並把匹配行輸出到標準輸出

grep [options] regex [file...]

regex 是指一個正則表達式。

  • grep 的選項
grep 的選項 功能 內容
-i 忽略大小寫 不會區分大小寫字符。也可用--ignore-case 來指定。
-v 不匹配。 一般,grep 程序會打印包含匹配項的文本行。這個選項致使 grep 程序只會打印不包含匹配項的文本行
也可用--invert-match 來指定。
-c 打印匹配的數量 也可用--count 選項來指定。
-l 打印包含匹配項的文件名,而不是文本行自己 也可用--files-with-matches 選項來指定。
-L 類似於-l 選項,可是隻是打印不包含匹配項的文件名 也可用--files-without-match 來指定。
-n 在每一個匹配行以前打印出其位於文件中的相應行號。也可用--line-number 選項來指定。
-h 應用於多文件搜索,只顯示內容,不輸出文件名。 也可用--no-filename 選項來指定。
  • 經常使用 grep 命令選項
經常使用 grep 命令選項 功能
ls /usr/bin |grep bus 顯示匹配到文件名中含有bus的文件名
grep bus dirlist* 顯示匹配左邊爲dirlist的文件名右邊含有bus的文件內容
grep -l bus dirlist* 只顯示左邊爲dirlist的文件名,不顯示文件內容
grep -h '^bus' dirlist* 顯示行首爲bus開頭的文件
grep -h 'bus' dirlist* 顯示行首、中間等位置含bus的文件
grep -h '[^dg]bus' dirlist* 不是d,不是g開頭的bus
grep -hE 'bus |zip' dirlist* 找bus或zip內容,-E
egrep -h 'bus |zip' dirlist* 找bus或zip內容,e

專項專題(選看)

顯示與查找文件

  • 經常使用命令
命令 功能
cat 用於顯示整個文件的內容,單獨使用沒有翻頁功能
所以常常和 more 命令搭配使用,cat 命令還有就是能夠將數個文件合併成一個文件的功能。
more 讓畫面在顯示滿一頁時暫停,此時可按空格健繼續顯示下一個畫面,或按 q 鍵中止顯示。
less經常使用 less 命令的用法與 more 命令相似,也能夠用來瀏覽超過一頁的文件
所不一樣的是 less 命令除了能夠按空格鍵向下顯示文件外,還能夠利用上下鍵來翻動文件。
當要結束瀏覽時,只要在 less 命令的提示符「:」下按 q 鍵便可。

其實這三個命令除了 cat 命令有合併文件的功能,其他功能上相近,只是從瀏覽習慣和顯示方式上有所不一樣。

  • 通配符 wildchar

快速指定一組文件名

通配符 含義 例子
* 0,1,more char
? 1 char
[character] one char in set
字符集中的任何一個
ls /etc/[dm]*.conf
列出以d或m開頭的配置文件
[!character] not one char in set
不是字符集中的任何一個
[[:class:]] one char in class
最常使用的字符類 含義 舉例
[:digit:] number;0~9,十個數字 ls /etc/rc[[:digit:]].d
/etc/rc0.d /etc/rc1.d /etc/rc2.d /etc/rc3.d
[:lower:] Matches any lowercase letter
匹配任意一個小寫字母
[:upper:] Matches any uppercase letter
匹配任意一個大寫字母
[:alnum:] num+alpha匹配任意一個字母或數字
[:alpha:] low and upper匹配任意一個字母
  • 查找文件
命令 內容 示例 例子
find 在一個目錄層次結構中搜索文件 find
find dir
find dir condition條件
注意:長命令的例外之處用單橫槓
find -type f查找路徑下的普通文件
find -name "*.txt" -or -size +100c
查找txt文件或大於100字節的
find -name "*.bak" -delete
刪除 bak 類型文件
stat 顯示文件或文件系統狀態
find 文件類型 含義
b 塊特殊設備文件
c 字符特殊設備文件
d 目錄
f 普通文件
l 符號連接
字符 find 大小單位
b 512 個字節塊。若是沒有指定單位,則這是默認值。
c 字節
w 兩個字節的字
k 千字節(1024個字節單位)
M 兆字節(1048576個字節單位)
G 千兆字節(1073741824個字節單位)
  • 操做符

即便擁有了 find 命令提供的全部測試條件,咱們還須要一個更好的方式來描述測試條件之間的邏輯關係

操做符 描述
-and 若是操做符兩邊的測試條件都是真,則匹配。能夠簡寫爲 -a。
注意若沒有使用操做符,則默認使用 -and。
-or 若操做符兩邊的任一個測試條件爲真,則匹配
能夠簡寫爲 -o。
-not 若操做符後面的測試條件是假,則匹配。能夠簡寫爲一個感嘆號(!)。
() 把測試條件和操做符組合起來造成更大的表達式。這用來控制邏輯計算的優先級。
注意 由於圓括號字符對於 shell 來講有特殊含義,
因此在命令行中使用它們的時候,它們必須 用引號引發來,
才能做爲實參傳遞給 find 命令。一般反斜槓字符被用來轉義圓括號字符。

歸檔 tar、解壓、批量

保護數據安全主要方式之一:備份

  • 歸檔:把多個文件和目錄合併成一個大的文件。

歸檔操做一般和壓縮操做配合使用

功能 命令 具體功能 示例 例子
備份
backup
gzip 壓縮或者展開文件
GNU zip
壓縮 gzip
解壓縮 gunzip
gzip -d filename
標準輸出顯示解壓文件內容,內容較多,用管道分頁
gunzip -c foo.txt.gz | less
歸檔
archieve
tar 打包文件或目錄
tap archieve
打包.tar
打包壓縮.tgz
tar -zcvf filename.tar.gz filename/
表示打包後壓縮
遠程同步 rsync 同步遠程文件和目錄
remote sync
rsync options source destination
本地->本地,本地->遠程
rsync -av 源文件 目的地
  • 壓縮與解壓縮

gzip 程序被用來壓縮一個或多個文件。當執行 gzip 命令時,則原始文件的壓縮版會替代原始文件

gzip 選項 含義 功能
-c creat 把輸出寫入到標準輸出,而且保留原始文件
-d decompress 解壓縮。gunzip <=>gzip -d
-f force 強制壓縮,即便原始文件的壓縮文件已經存在了,也要執行。
-h help 顯示用法信息。
-l list 列出每一個被壓縮文件的壓縮數據。
-r recursive 若命令的一個或多個參數是目錄,則遞歸地壓縮目錄中的文件。
-t test 測試壓縮文件的完整性。
-v verbose 顯示壓縮過程當中的信息,更詳細的列表信息輔助選項
(1)查看需操做文件。拷貝本機的配置文件和目錄,包括腳本及用戶帳號密碼等信息
ls -l /etc > foo.txt
ls -lh
-rw-r--r--   1 root root  15K 6月   30 22:40 foo.txt

(2)對文件進行壓縮
gzip foo.txt
ll
-rw-r--r--   1 root root   2980 6月  30 22:41 foo.txt.gz

此時容量由15k變爲2980,壓縮變小了。而且foo.txt文件消失了,增長了紅色的foo.txt.gz壓縮包

(3)對壓縮包進行解壓
gunzip foo.txt.gz
ll
-rw-r--r--   1 root root  14907 6月   30 22:43 foo.txt
此時容量由2980變爲14907,恢復原大小。而且foo.txt.gz壓縮包文件消失了,增長了白色的foo.txt普通文件

簡化上面2步驟爲

ls -l /etc | gzip > foo.txt.gz
ll
-rw-r--r--   1 root root   2980 6月  30 22:41 foo.txt.gz
  • 打包

tar mode[options] pathname...

tar 模式 功能
c create 爲文件和/或目錄列表建立歸檔文件
C 解壓到指定目錄
x 抽取歸檔文件。
r 追加具體的路徑到歸檔文件的末尾。
t 列出歸檔文件的內容
z 使用gzip壓縮算法來壓縮打包後的文件
(1)歸檔查看需操做文件。

tar cf playground.tar playground/
ll
drwxrwxr-x 102 teenie teenie   4096 6月  30 20:34 playground/
-rw-r--r--   1 root   root    61440 6月  30 22:45 playground.tar
(2)查看歸檔下內容
tar tf playground.tar

(3)提取歸檔
把tar文件釋放到foo1文件夾下
mkdir foo1
cd foo1
tar xf ../playground.tar
ll
drwxrwxr-x 102 book book 4096 6月  30 00:34 playground/
(4)歸檔並壓縮
tar czf playground.tgz  playground
  • 經常使用打包並壓縮命令
序號 功能 命令
1 打包 tar -cvf
2 gzip壓縮 tar -czvf
3 bzip2壓縮 tar -cjvf
4 tar -xvf
5 bzip2解壓 tar -xjvf
  • tar 批量問題

我想進行批量解壓tar文件,使用tar -xvf .tar會出錯,提示「Not found in archive」。

解決方法有不少,好比寫一個腳本之類的。

請問爲何tar不支持這種通配符語法呢?是否有特殊的緣由? 我試過gzip就支持 gzip -d .tar.gz。

回答:通配符是shell解決的問題。

tar -xvf *.tar實際上執行tar時,tar接收到的展開是 tar -xvf a.tar b.tar c.tar …

若是當前目錄跟本沒有tar的東西,那麼tar就收到’*.tar’這個參數

與win不一樣,linux全部字符均可以做文件名,也即目錄中不存在着 *.tar這個文件

爲了防止 *.tar被shell解釋爲a.tar b.tar c.tar…

能夠給它加個單引號。用tar解開一個Archive時,語法是 tar -xvf <tarfile.tar>

<tarfile.tar> 是選項f所要求的,只能是一個文件,好比myfiles.tar。

myfiles.tar所包含的歸了檔的文件中的一個或者多個成員文件。

  • 遠程同步

  • 學習 sync 有什麼用?

我感受用不到,遠端能夠用git拉取,本地能夠拷貝。那麼有沒有必要了解該指令呢?

我我的以爲指令不重要,重要的是原理。原理須要手動去實現才能更直觀掌握。即便在命令行下用不到,但在其餘領域,同步的概念仍然會有,例如我在雙系統下,使用火狐的同一帳號能夠同步書籤等內容,須要驗證的窗口提示「sync」等單詞,我看到該單詞就當即明白該頁內容,而不是一個陌生概念,須要翻譯整個頁面,還要考慮安全問題。

  • 實例:把playground文件夾下內容同步到foo文件夾下
ls
foo playground 

rsync -av playground foo
    顯示信息 源文件  目的地
此時,foo文件夾下就有了playground文件夾及其下全部內容
ls foo/
playground

rsync -av playground foo
再執行一遍,沒有變化則不會作同步操做
對其中一個文件做更改則只同步那一個文件

內存與進程的性能

  • 查看磁盤剩餘空間的數量,disk free

df

To see the current amount of free space on your disk drives

文件系統        含量          已用    可用    已用%  掛載點
Filesystem     1K-blocks      Used Available Use% Mounted on
udev             3041592         0   3041592   0% /dev
tmpfs             614356     16924    597432   3% /run
/dev/sda1      102049120  11838668  85003620  13% /
tmpfs            3071760       328   3071432   1% /dev/shm
tmpfs               5120         4      5116   1% /run/lock
tmpfs            3071760         0   3071760   0% /sys/fs/cgroup
/dev/sdb1      309505024    280824 293479228   1% /work
vmhgfs-fuse    524289020 292404892 231884128  56% /mnt/hgfs
tmpfs             614356        72    614284   1% /run/user/1000
  • 顯示內存剩餘空間

free

To display the amount of free memory.

total        used        free      shared  buff/cache   available
Mem:        6143524      983732      506060       31860     4653732     4744492
Swap:       1045500           0     1045500
  • 進程

如今的操做系統都支持多任務,意味着操做系統經過在一個執行中的程序和另外一個 程序之間快速地切換形成了一種它同時可以作多件事情的假象。Linux 內核經過使用進程來 管理多任務。進程,就是Linux 組織安排正在等待使用 CPU的各類程序的方式。

命令 查看進程
ps Report a snapshot of current processes
報告當前進程快照(內容不多
ps
ps x
ps aux
top Display tasks
顯示任務,每3秒鐘更新一次動態信息
命令 進程控制管理
kill Send a signal to a process
給一個進程發送信號
kill [-signal] PID
jobs List active jobs
列出活躍的任務
bg Place a job in the background
把一個任務放到後臺執行
中止一個進程,而不是終止它。
fg Place a job in the foreground
把一個任務放到前臺執行
爲了讓一個進程返回前臺。
一個在後臺運行的進程對一切來自鍵盤的輸入都免疫,也不能用 Ctrl-c 來中斷它。
ps
   PID TTY          TIME CMD
 84009 pts/18   00:00:00 bash
 87162 pts/18   00:00:00 bash
 88998 pts/18   00:00:00 bash
 92203 pts/18   00:00:00 ps

ps x
   PID TTY      STAT   TIME COMMAND
  2163 ?        Ss     0:01 /lib/systemd/systemd --user
  2164 ?        S      0:00 (sd-pam)
  2169 ?        Sl     0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
...

ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.0 185312  5800 ?        Ss   6月11   0:12 /sbin/init sp
root          2  0.0  0.0      0     0 ?        S    6月11   0:00 [kthreadd]
...
進程號 命令 CPU佔用率 內存消耗 虛擬內存使用 物理內存使用 進程狀態 運行時長 消耗CPU時間
PID TTY CMD %CPU %MEM VSZ RSS STAT START TIME
process id teletype command memory vitual memory phisical memory state
進程狀態 意義
R 進程正在運行或準備運行。
S 正在睡眠。進程沒有運行,而是,正在等待一個事件, 好比說,一個按鍵或者網絡分組。
D 不可中斷睡眠。進程正在等待 I/O,比方說,一個磁盤驅動器的 I/O。
T 已中止. 已經指示進程中止運行。稍後介紹更多。
Z 一個死進程或「殭屍」進程。這是一個已經終止的子進程,可是它的父進程尚未清空它。 (父進程沒有把子進程從進程表中刪除)
< 一個高優先級進程。這可能會授予一個進程更多重要的資源,給它更多的 CPU 時間。 進程的這種屬性叫作niceness。具備高優先級的進程聽說是很差的(less nice), 由於它佔用了比較多的 CPU 時間,這樣就給其它進程留下不多時間。
N 低優先級進程。一個低優先級進程(一個「nice」進程)只有當其它高優先級進程被服務了以後,纔會獲得處理器時間。
  • kill殺死進程
top

  PID USER      PR  NI    VIRT    RES    SHR S    %CPU   %MEM  TIME+ COMMAND
92495 teenie      20   0 1992668 265724 135284 S   0.3  4.3   0:29.76 firefox
...

我想關閉火狐瀏覽器

kill 92495
此時瀏覽器被關閉

存儲媒介-設備掛載

llinux有很是強大得設備管理能力。

物理設備:好比說硬盤,仍是網絡設備。
虛擬存儲設備:像 RAID(獨立磁盤冗餘陣列)和 LVM(邏輯卷管理器)。

命令行須要手動完成設備掛載

  • 掛載

把設備鏈接到文件系統樹種,容許設備參與操做系統的文件系統中。

存儲設備 的重要管理命令
mount 掛載一個文件系統
umount 卸載一個文件系統

網絡

Linux 有大量豐富的網絡命令,被用來建立各式各樣的網絡系統和裝置, 包括防火牆,路由器,名稱服務器,網絡鏈接式存儲設備等。

命令 監測網絡和傳輸文件 例子
ping 發送 ICMP ECHO_REQUEST 數據包到網絡主機 命令 ping 後跟IP地址或域名
traceroute 打印到一臺網絡主機的路由數據包
netstat network 網絡 statistics 統計 。打印網絡鏈接,路由表,接口統計數據,假裝鏈接,和多路廣播成員 netstat -ie<=>ifconfig打印網卡接口信息
netstat -rn打印路由表
ftp 因特網文件傳輸程序
ssh Secure Shell,client Server 22 使用22號端口。遠程登陸程序 ssh user_namer@host_name command
  • 丟包率---衡量通訊是否正常的指標

一旦啓動,ping 命令會持續在特定的時間間隔內(默認是一秒)發送數據包,直到它被中斷

按下組合鍵 Ctrl-c,中斷這個命令以後,ping 打印出運行統計信息

一個正常工做的網絡會報告零個數據包丟失

一個成功執行的「ping」命令會意味着網絡的各個部件(網卡,電纜,路由,網關) 都處於正常的工做狀態。

  • 網絡測試

  • 網絡正常

ping www.baidu.com

PING www.a.shifen.com (182.61.200.6) 56(84) bytes of data.
域名先被解析爲IP地址
64 bytes from 182.61.200.6: icmp_seq=1 ttl=51 time=47.5 ms
再由 IP 地址回覆消息,每隔1秒返回一個數據包
64 bytes from 182.61.200.6: icmp_seq=2 ttl=51 time=44.5 ms
64 bytes from 182.61.200.6: icmp_seq=3 ttl=51 time=44.5 ms
按 ctrl+c 後,會中止並打印簡單報告
...
--- www.a.shifen.com ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7020ms
rtt min/avg/max/mdev = 44.533/45.274/47.577/0.957 ms
  • 網絡有問題

隨便寫了地址,主機不存在的,可能產生 ping 不通的狀況

ping 192.168.20.20
等一分鐘沒有任何反應

PING 192.168.20.20 (192.168.20.20) 56(84) bytes of data.

--- 192.168.20.20 ping statistics ---
20 packets transmitted, 0 received, 100% packet loss, time 19442ms
  • 測試網絡問題的方法步驟

(1)本機 IP 地址測試

ping 127.0.0.1

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.059 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.027 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.053 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.058 ms
^C
--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3064ms
rtt min/avg/max/mdev = 0.027/0.049/0.059/0.013 ms

(2)本身的 IP 地址測試

ping 192.168.31.137

PING 192.168.31.137 (192.168.31.137) 56(84) bytes of data.
64 bytes from 192.168.31.137: icmp_seq=1 ttl=64 time=0.175 ms
64 bytes from 192.168.31.137: icmp_seq=2 ttl=64 time=0.060 ms
64 bytes from 192.168.31.137: icmp_seq=3 ttl=64 time=0.058 ms
^C
--- 192.168.31.137 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3080ms
rtt min/avg/max/mdev = 0.048/0.085/0.175/0.052 ms

(3)網關測試

ping 192.168.31.1

PING 192.168.31.1 (192.168.31.1) 56(84) bytes of data.
64 bytes from 192.168.31.1: icmp_seq=1 ttl=64 time=5.32 ms
64 bytes from 192.168.31.1: icmp_seq=2 ttl=64 time=3.21 ms
^C
--- 192.168.31.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 79774ms
rtt min/avg/max/mdev = 3.219/4.274/5.329/1.055 ms

(4)結論

若前3步都是正常的,只有目標主機 ping 不通,則肯定本機網絡沒問題

目標機 192.168.20.20 的主機不存在或者宕機了。

  • 網絡統計

netstat -ie

打印網卡接口信息

ifconfig

Kernel Interface table
ens33     Link encap:Ethernet  HWaddr 00:0c:29:f8:f3:18  
          inet addr:192.168.31.137  Bcast:192.168.31.255  Mask:255.255.255.0
          inet6 addr: fe80::bdc1:5d66:2d85:1808/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1315640 errors:0 dropped:0 overruns:0 frame:0
          TX packets:266354 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:504190955 (504.1 MB)  TX bytes:19535936 (19.5 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:184851 errors:0 dropped:0 overruns:0 frame:0
          TX packets:184851 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:9704102 (9.7 MB)  TX bytes:9704102 (9.7 MB)

UP 啓用;Down 禁用

兩張網卡 屬性 IP 地址
ens 以太網 192.168.31.137
Io 虛擬網卡 127.0.0.1
  • 打印路由表

netstat -rn

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.31.1    0.0.0.0         UG        0 0          0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 ens33
192.168.31.0    0.0.0.0         255.255.255.0   U         0 0          0 ens33

Destination:目的地

192.168.31.0 本機在同一網段地址。

Gateway:網關

不能識別的地址都向網關上發,例如此處的 192.168.31.1 網關地址。網關地址爲 0.0.0.0 時,不須要網關轉發。

  • ssh

windows能夠用Xshell、PuTTY 鏈接到 linux 系統上。

linux 鏈接到 linux 系統則用SSH命令自己

例如,我用虛擬機中的 centOS7與ubuntu16命令行交互

ssh root@192.168.31.137
root@192.168.31.137's password:
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.15.0-52-generic x86_64)
...
Last login:Thu Jun 30 22:11:46 2019 from 192.168.31.57

定製 shell

shell環境

  • 如何創建 shell 環境?

當咱們登陸系統後, bash 程序啓動,而且會讀取一系列稱爲啓動文件的配置腳本, 這些文件定義了默認的可供全部用戶共享的 shell 環境。而後是讀取更多位於咱們本身家目錄中 的啓動文件,這些啓動文件定義了用戶我的的 shell 環境。確切的啓動順序依賴於要運行的 shell 會話 類型。有兩種 shell 會話類型:一個是登陸 shell 會話,另外一個是非登陸 shell 會話。

登陸 shell 會話會在其中提示用戶輸入用戶名和密碼;例如,咱們啓動一個虛擬控制檯會話。

文件名 登陸 shell 會話的啓動文件
/etc/profile 應用於全部用戶的全局配置腳本。
~/.bash_profile 用戶我的的啓動文件。能夠用來擴展或重寫全局配置腳本中的設置。

非登陸 shell 會話一般當咱們在 GUI 下啓動終端會話時出現。

文件名 非登陸 shell 會話的啓動文件
/etc/bash.bashrc 應用於全部用戶的全局配置文件。
~/.bashrc 用戶我的的啓動文件。能夠用來擴展或重寫全局配置腳本中的設置。

*注意:更換環境時,須要拷貝本身須要的環境文件,方便在新環境裏自動配置,例如:~/.bashrc

檢查環境變量命令 內容 例子
printenv 打印部分(跟參數)或所有(不跟參數)的環境變量 printenv USER
teenie
跟參數顯示部分
set 設置 shell 選項 set
export 導出環境變量,讓隨後執行的程序知道。
alias 建立命令別名 詳情見對應章節
經常使用變量 內容
SHELL shell 程序的名字。
HOME 家目錄
LANG 定義了字符集以及語言編碼方式。
PATH 由冒號分開的目錄列表,可執行程序路徑。
PS1 Prompt String 1.提示字符串。 命令提示符定義
PWD 當前工做目錄。
TERM 終端類型名。類 Unix 的系統支持許多終端協議;這個變量設置你的終端仿真器所用的協議。
USER 你的用戶名

定製 shell 提示符$PS1

我目前的格式爲:
[Teenie@wutiantian.github.io ~]$

打印當前PS1變量

echo $PS1
\u@wutiantian.github.io:\w\$

修改成本身定製的 shell 提示符步驟:
(1)打開配置文件,非登陸 shell 會話的啓動文件。
vi ~/.bashrc
(2)修改命令提示符
PS1='\u:\W$'

保存便可設置爲:[當前登錄用戶@主機名 當前工做目錄的最後部分]$

轉義字符 Shell 提示符中用到的 意義
W 當前工做目錄名的最後部分
w 當前工做完整目錄名
\H 完整的主機名。
\u 當前用戶名。
[ 標誌着一系列一個或多個非打印字符的開始。這被用來嵌入非打印 的控制字符,這些字符以某種方式來操做終端仿真器,比方說移動光標或者是更改文本顏色。
] 標誌着非打印字符序列結束。

別名alias-建立你本身的命令

command1; command2; command3...

多個命令放在同一行上,命令之間 用」;」分開

命令 含義 示例
alias Create an alias for a command
建立命令別名
alias列出機器上全部的別名
alias name='command string'新建別名
unalias foo 刪除別名爲foo
cd /usr; ls; cd  三個命令依次執行,分好作間隔<=>alias foo='cd /usr; ls; cd'

注意:若不保存配置到配置文件中,則重啓後丟失別名內容

步驟 內容 操做
1 打開配置文件 vi .bashrc
2 添加別名行內容 alias la='ls -al'
3 讓配置文件起做用 source .bashrc
4 運行,測試 la

寫腳本

註釋第一行

  • "!"是一個約定的標記,它告訴系統這個腳本須要什麼解釋器來執行
#!/usr/bin/bash
  • 井號爲單行註釋符。

  • 沒有多行註釋符。

註釋提示,去系統的PATH目錄中查找。

變量

my_name="jack"
my_name='jack';

變量名和等號之間不能有空格,變量後面不能有;

Shell中的引號和PHP相似,字符串能夠用單引號,也能夠用雙引號

單引號字符串的限制:

  • 單引號裏的任何字符都會原樣輸出,單引號字符串中的變量是無效的(詳細見單引號-禁止展開,章節)
  • 單引號字串中不能出現單引號(對單引號使用轉義符後也不行

雙引號:

  • 雙引號裏能夠有變量
  • 雙引號裏能夠出現轉義字符

使用變量

對於已經定義過的變量,使用的適合在前面添加$

echo $my_name
echo ${my_name}

變量名外面的花括號是可選的,加不加都行,建議使用第二種形式

聲明數組

array_name=(value0 value1 value2 value3) 
# 或
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
# 讀取數組 ${數組名[下標]}
echo ${array_name[@]}
# 取得數組元素的個數
echo ${#array_name[@]}
# 取得數組單個元素的長度
echo ${#array_name[n]}

表達式

左值    右值
空間  =  值

                賦值的等號兩邊不能有空格
傳參=傳值            形參=實參
                判斷的等號兩邊有空格

a=b表示賦值,等號先後無空格

a = b表示判斷,等號先後有空格

[ a=b ]中括號內部字符,兩邊都須要有空格

數學運算

Shell 的數學運算和咱們高級語言中的語法徹底不同。

int a = 10 + 5;

你覺得是這麼寫的:

#!/bin/bash
a=10+5
echo $a

Shell 中把全部東西都當成是一個字符串,因此這裏它並不知道咱們要它進行數學運算。

實際上在 Shell 中你要進行這樣的數學運算,你應該這麼寫:

#!/bin/bash
a=`expr 10 + 5`
echo $a

你還能夠這麼寫:

#!/bin/bash
let a=10+5
echo $a

我更推薦用下面這種形式:

(( a = 10 + 5 ))
echo $a

將須要運算的內容放在兩對中括號裏面。由於這種方式更加簡潔,而且功能也是最爲完整,也是最爲接近高級語言的寫法。

流程控制-if

  • if

特別須要注意的是 if 後面的表達式,其左右兩邊都要留有一個空格,這是 Shell 的語法。

a=10
b=20

# if
if [ $a==$b ] 
then 
  echo "true"; 
fi

# if-else
if [$a==$b]
then
    echo 'true'
else
    echo 'false'
fi

# if-elseif-else
if [ $a == $b ]
then
   echo "a 等於 b"
elif [ $a -gt $b ]
then
   echo "a 大於 b"
elif [ $a -lt $b ]
then
   echo "a 小於 b"
else
   echo "沒有符合的條件"
fi

流程控制-循環

#for循環
for loop in 1 2 3 4 5
do
    echo "The value is: ${loop}"
done
# 或
for ((i=0;i<100;i++))
do
    echo "The value is: ${loop}"
done
#while循環
int=0
while(( $int<=5 ))
do
    echo $int
    let "int++"
done
  • for循環
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

for var in item1 item2 ... itemN; do command1; command2… done;

  • 無限循環

  • for (( ; ; ))

  • while

while condition
do
    command
done

while循環用於不斷執行一系列命令,也用於從輸入文件中讀取數據;命令一般爲測試條件。

int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

語句

腳本習題

  • 解壓imagenet2012的標註數據, 數據在/home/studyer/course/第一篇-編程基礎/linux基礎/做業4 批量解壓。
    創建文件夾test1,將壓縮包放在下面
for dir in test1/*
do
     if test -f $dir
     then
       brr=$(echo $dir | tr "." "\n")
       brrs=( $brr )
       fileid=${brrs[0]}
       echo $fileid
       mkdir $fileid
       tar -xvf $dir -C $fileid
    fi
done

分析:
批量解包+右擊解壓Extract Here

for 變量 in 列表

爲test1/*路徑下的各文件解包,dir變量文件名

do循環

if 判斷,若是dir變量文件名 ,是一個普通文件則結果爲真,執行then內容

一個文件夾下循環到的多是文件或文件夾,判斷循環到的是否是文件夾

打印提取的dir變量文件名,刪除"."與換行符,賦值給brr變量

brrs接收brr變量值

把brrs數組下的名稱分次給fileid變量名

打印出每次的fileid變量名

建立fileid變量名的文件夾

進行解x包tar操做,過程當中信息v顯示在輸出屏幕上,每次解包到指定的建立的fileid變量名的文件夾中。

附錄:如何查看 man 幫助手冊

1、 內容結構(說明書頁的格式)

標題 含義
Name 命令的名稱和用途(摘要)
Synopsis 命令語法(摘要)
Descripition 完整描述
Environment 命令使用的環境變量
Author 做者
Files 對該命令重要的文件列表
See also 查看相關的信息位置
Diagnostics 診斷。可能的錯誤和警告
Bugs 錯誤、缺點、警告

2、 命令語法的形式描述

(1)方括號中的項是可選的
(2)不在方括號或者大括號中的想是必選項
(3)粗體字必須按原樣準確鍵入。這一類多是命令名、標誌和文字字符。
(4)斜體字必須用適當的值代替(不顯示斜體字的系統上,一般用下劃線代替,就如同變量通常,須要根據本身添加適當的值)
(5)後面接省略號(...)的參數能夠屢次重複。
(6)若是一個單獨的選項和一個參數組合在一塊兒,那麼該選項和參數必須同時使用
(7)由|豎線字符分開的兩個或多項,表示能夠從這個列表中選擇一個項。

3、 man 手冊的章節

一、Standard commands (標準命令)
二、System calls (系統調用)
三、Library functions (庫函數)
四、Special devices (設備說明)
五、File formats (文件格式)
六、Games and toys (遊戲和娛樂)
七、Miscellaneous (雜項)
八、Administrative Commands (管理員命令)

4、 命令

man man

查看man 手冊的說明

MAN(1)                        Manual pager utils                        MAN(1)

NAME
       man - an interface to the on-line reference manuals

SYNOPSIS
       man  [-C  file]  [-d]  [-D]  [--warnings[=warnings]]  [-R encoding] [-L
       locale] [-m system[,...]] [-M path] [-S list]  [-e  extension]  [-i|-I]
       [--regex|--wildcard]   [--names-only]  [-a]  [-u]  [--no-subpages]  [-P
       pager] [-r prompt] [-7] [-E encoding] [--no-hyphenation] [--no-justifi‐
       cation]  [-p  string]  [-t]  [-T[device]]  [-H[browser]] [-X[dpi]] [-Z]
       [[section] page ...] ...
       man -k [apropos options] regexp ...
       man -K [-w|-W] [-S list] [-i|-I] [--regex] [section] term ...
       man -f [whatis options] page ...
       man -l [-C file] [-d] [-D] [--warnings[=warnings]]  [-R  encoding]  [-L
       locale]  [-P  pager]  [-r  prompt]  [-7] [-E encoding] [-p string] [-t]
       [-T[device]] [-H[browser]] [-X[dpi]] [-Z] file ...
       man -w|-W [-C file] [-d] [-D] page ...
       man -c [-C file] [-d] [-D] page ...
       man [-?V]

man ls

查看ls 命令手冊的默認第一頁

man 1 ls

查看ls 命令手冊的默認第一頁

LS(1)                            User Commands                           LS(1)

NAME
       ls - list directory contents

SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List  information  about  the FILEs (the current directory by default).
       Sort entries alphabetically if none of -cftuvSUX nor --sort  is  speci‐
       fied.

       Mandatory  arguments  to  long  options are mandatory for short options
       too.

       -a, --all
              do not ignore entries starting with .

       -A, --almost-all
              do not list implied . and ..

       --author

man 1 gcc

用gcc編譯器編譯程序,查看gcc命令手冊第一頁

GCC(1)                                GNU                               GCC(1)

NAME
       gcc - GNU project C and C++ compiler

SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-Wpedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...

       Only the most useful options are listed here; see below for the
       remainder.  g++ accepts mostly the same options as gcc.

DESCRIPTION
       When you invoke GCC, it normally does preprocessing, compilation,
       assembly and linking.  The "overall options" allow you to stop this
       process at an intermediate stage.  For example, the -c option says not
       to run the linker.  Then the output consists of object files output by
       the assembler.

man 2 open

查看系統調用open 的man 手冊說明

OPEN(2)                    Linux Programmer's Manual                   OPEN(2)

NAME
       open, openat, creat - open and possibly create a file

SYNOPSIS
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);

       int creat(const char *pathname, mode_t mode);

       int openat(int dirfd, const char *pathname, int flags);
       int openat(int dirfd, const char *pathname, int flags, mode_t mode);

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       openat():
           Since glibc 2.10:
               _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L

5、 使用範例

附錄:學習方法

命令行與指令緊密結合,大量的命令須要記憶。想要快速得掌握,背誦和看資料是沒有用的,腦子記憶不深入,必須練習犯錯才能使得腦獲得異常信號來增強記憶。把A文件移動到B文件夾下,方式有不少種,選擇你認爲簡單的那種熟練操做就好。大多數的初學者,錯誤都在拼寫,和腦子思考深度無關。熟練了以後,再進行操做則像肌肉般,不過大腦就已經敲出代碼,解決問題。

前期只有經過大量的練習,才能在複雜狀況下有老司機般應急處理能力。如果連敲錯一個字母這類低級語法錯誤的提示語句都不能當即判斷出故障緣由,那就不要想着處理高級任務。

主動給本身出題。出題意圖、考察點、任務目標,本身先過一遍。

我本科期間學了一門《微機原理與接口技術》課程很是好。起步就是八大指令 MOV 的彙編跳轉,後面的內容則是定時器完成40行的小程序。不少同窗敗在了起步,雖然只有八大指令,但指令限制致使組合不少,移動跳轉都不會更沒法進行後續程序編寫。書上題目並很少,有的甚至由於排版是錯的答案,大多數人就放棄了。而我就不一樣,我會在圖書館找幾本同類書對比做補充。雖然每本書都有可能錯一部份內容,但不可能全部書的全部題目都是錯的。題目作的對不對,本身內心是有數的,幾本書即便錯也不會錯法徹底相同,因此發現錯並跳過錯題仍是有譜的。實在沒有題目時,我會本身出題,更有目標感去鑽研,不會還能夠上網查。經過必定數量的訓練,找出規律,得出本身的正確模型進而掌握該知識。切忌中止腳步!

  • 關於學習資料的選擇

特別是初學編程者,敲代碼的行數少於1萬行,學習順序「與任務目標一致視頻>專門該領域書本>散亂的博客」>瞎學。

要解決的任務比較靈活,沒法直接抄,或者拿來主義卻徹底看不懂甚至還須要作裁剪時,每每稍微翻書的三腳貓功夫是不能應付的,若是有分值,大概要70分以上。

初學者對編程思想領悟力很弱,不少地方考慮不周全,學了卻有不少遺漏,應付不來任務。此時理解概念經過人講授效果最好。至於看誰的視頻,沒有非得某一我的不可的說法,找前3個有名的、有趣方便記憶的、成體系、周邊練習配套完善的,新的能用的上的(這是我學習考研政治的學法類比出來的)。認真學習一套,遠比比較評價 N 套視頻有效果。每一個講師其實都有各自優勢,只有虔誠認真深刻地掌握才能達到好的效果。

初學者書讀得太快,合上書可能等於沒讀。太厚的書容易陷入其中,迷茫,致使章節分配時間沒有規劃,到處是重點草木皆兵,最後放棄。

非初學者,對該知識有所涉獵,此時時間爲王。當書很厚,只緣身在此山中時,微博或 書的PPT 都能儘快拎得清主線,抓住重點,重點地方各個擊破,快速閱讀與仔細閱讀結合。以後再有針對性地看某幾節的視頻。

關於視頻,是人的經驗總結。裏面只要有一句話對你有用,那麼就足夠了。這句話每每是核心思想之一,有的是本身總結的,這是初學者巧婦難爲無米之炊,腦子裏的首創性。有的書中有卻沒注意的,每每須要看第二遍之後才發現,這時候已經花費不少時間,看視頻舊能節省時間。例如,王頂老師在視頻裏說起的:圖形讓簡單的任務更簡單,命令行讓複雜的任務成爲可能。簡單的兩句比看多少條的優勢羅列明瞭。

關於好書,老是要讀上幾遍的,溫故知新,不羞恥。

附錄:鳴謝

鳴謝王頂老師(河北經貿大學老師)!

由於我要寫腳本完成批量處理的任務,因此我在騰訊課堂上觀看了他的課程。網上也有其餘教程,例如老男孩的運維視頻節數百節之多,真心沒時間看,並且與我須要的內容並非徹底重合。王頂老師的視頻是13小時,39課時,長度適中,有一半課程是能夠試看,我看了幾節感受首創的成語穿插知識點容易理解記憶,因而就學了下去,用QQ積分免費兌換總價15元課程,沒花錢學了課程。線下我 QQ 向王頂老師請教關於腳本的學習,老師推薦我用他 github倉庫上的幾個腳本倉庫源文件來分析練習,並在網上找了一些理論素材給我作補充。王頂老師一直以來都是有問必答,回覆及時。有些與課程無關的技術問題,王老師盡最大可能把知道的知識告訴我,幫助我。由於有他,我在跨領域的學習勇敢學習應用提高本身技能與效率。感謝良師益友的陪伴!

相關文章
相關標籤/搜索