做者:吳甜甜
我的博客網站: 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 是在深圳的一家fpga的方案公司參觀交流時,看到工程師對fpga進行編程時,敲幾個字符就插入了代碼塊,感受很快,是生產力的決勝武器。工程師告訴我,每一個 fpga 公司都有本身的核心技術專利,編寫好的私有庫就是經過幾個字符的腳本插入到程序中,每家都不一樣,模塊不對外公開。算法
我意識到,成爲具備核心價值的工程師必須掌握這項技能!shell
我本科時學的是電子信息工程,對軟件的態度並無什麼都要會的意識,只是用到再學。但對於 shell ,它並不能迫在眉睫能解決什麼必須處理的問題,卻成爲人與人差距的重要一環之一。express
寫本內容時,是應用於圖像機器學習中遇到實際問題寫的我的筆記。當我準備用手頭的《Linux程序設計》書時,很失望,看着塊頭挺大。內容可看的很少。網上的博客大多數內容比較淺,實戰性不強。因此我本身寫給本身複習。
嵌入式的shell是精簡過的,語法略有不一樣,這點要注意。好比說數組,部分命令的輸出和PC尚的存在必定差別。
shell:
一說到命令行,咱們真正指的是 shell。
shell 就是一個程序,它接受從鍵盤輸入的命令, 而後把命令傳遞給操做系統去執行。
BASH
「bash」 是 「Bourne Again SHell」 的首字母縮寫。
bash 是由 Steve Bourne 的人寫成 shell 程序的加強版
由於基於「命令行」界面,而不是「圖形」界面,因此 shell 與 bash 的適應性更強,能應用在多種系統中,是「通殺」的技能。
經常使用功能例舉 | 功能簡述 | 優點 | 功能 |
---|---|---|---|
1 | 自動運行命令行 | 自動執行多組操做 | 添加一條命令行,每次輸入幾個字符(打開bash)時都會自動運行 |
2 | alias別名 | 簡化單組操做字符數 |
步驟 | 內容 | 詳細 |
---|---|---|
1 | 編寫一個腳本。 | shell 腳本就是普通的文本文件。因此咱們須要一個文本編輯器來書寫它們。最好的文本 編輯器都會支持語法高亮,這樣咱們就可以看到一個腳本關鍵字的彩色編碼視圖。語法高亮會幫助咱們查看某種常見 錯誤。爲了編寫腳本文件,vim,gedit,kate,和許多其它編輯器均可以。 |
2 | 使腳本文件可執行。 | 系統會至關挑剔不容許任何舊的文本文件被看做是一個程序,而且有充分的理由! 因此咱們須要設置腳本文件的權限來容許其可執行。 |
3 | 把腳本放置到 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... ...
顏色屬性 | 白 | 藍 | 淺藍 | 綠 | 紅 | 紅色閃爍 | 黃 | 灰 | |
---|---|---|---|---|---|---|---|---|---|
文件類型 | 普通文件 | 目錄 | 連接文件 | 可執行文件 | 壓縮文件 | 連接有問題文件 | 設備文件 | 其餘文件 |
解析例如: 檔案類型權限 連節數 檔案擁有者 檔案所屬羣組 文件大小 檔案最後被修改時間 檔名 -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 | 系統命令的存儲位置 |
至少包括兩部分,(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
命令 | 全英文 | 用法 |
---|---|---|
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在處理依賴問題上更佳一些。
編譯就是把源碼(一個由程序員編寫的人類可讀的程序的說明)翻譯成計算機處理器的語言的過程。
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
編譯緣由 | 內容 |
---|---|
可用性 | 有些發行版不包含全部程序 |
即時性 | 得到最新版本程序 |
當按下 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 防止美圓符號展開
」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 |
轉義符 | \ |
global regular expression print
咱們能看出 grep 程序和正則表達式有關聯。
本質上,grep 程序會在文本文件中查找一個指定的正則表達式,並把匹配行輸出到標準輸出。
grep [options] regex [file...]
regex 是指一個正則表達式。
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 命令選項 | 功能 |
---|---|
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 命令有合併文件的功能,其他功能上相近,只是從瀏覽習慣和顯示方式上有所不一樣。
快速指定一組文件名
通配符 | 含義 | 例子 |
---|---|---|
* | 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 命令。一般反斜槓字符被用來轉義圓括號字符。 |
保護數據安全主要方式之一:備份
歸檔操做一般和壓縮操做配合使用。
功能 | 命令 | 具體功能 | 示例 | 例子 |
---|---|---|---|---|
備份 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 -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」等單詞,我看到該單詞就當即明白該頁內容,而不是一個陌生概念,須要翻譯整個頁面,還要考慮安全問題。
ls foo playground rsync -av playground foo 顯示信息 源文件 目的地 此時,foo文件夾下就有了playground文件夾及其下全部內容 ls foo/ playground rsync -av playground foo 再執行一遍,沒有變化則不會作同步操做 對其中一個文件做更改則只同步那一個文件
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」進程)只有當其它高優先級進程被服務了以後,纔會獲得處理器時間。 |
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 時,不須要網關轉發。
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
當咱們登陸系統後, 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 | 你的用戶名 |
我目前的格式爲:
[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 | 當前用戶名。 |
[ | 標誌着一系列一個或多個非打印字符的開始。這被用來嵌入非打印 的控制字符,這些字符以某種方式來操做終端仿真器,比方說移動光標或者是更改文本顏色。 |
] | 標誌着非打印字符序列結束。 |
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 後面的表達式,其左右兩邊都要留有一個空格,這是 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 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
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變量名的文件夾中。
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倉庫上的幾個腳本倉庫源文件來分析練習,並在網上找了一些理論素材給我作補充。王頂老師一直以來都是有問必答,回覆及時。有些與課程無關的技術問題,王老師盡最大可能把知道的知識告訴我,幫助我。由於有他,我在跨領域的學習勇敢學習應用提高本身技能與效率。感謝良師益友的陪伴!