1.變量定義
變量=變量內容 如myName=Jocelyn
知識點如下:
- 等號連邊不能有空格
- 變量只能以英文開頭,只能是英文字母與數字。
- 變量內容有空格可用雙引號"(特殊字符保留原有特性) 或單引號'(特殊字符僅為一般字符)將內容結合起來
- 可用跳脫字符\ 將特殊字符轉為一般字符。
- 變量追加內容 myName="$myName":Brown
- 變量需要在其他子程序執行,需要以export來使變量變成環境變量。
- 通常系統變量使用大寫字符,自定義一般使用小寫字符。
- 取消變量的方法使用 unset: [unset 變量名稱]
2.查看變量
- env 可用于觀察環境變量
- export 展示所有環境變量
- set 可觀察所有變量
幾個比較重要的參數- PS1 『命令提示字符』
- \d :可顯示出『星期 月 日』的日期格式,如:"Mon Feb 2"
- \H :完整的主機名。舉例來說『study.centos.jocelyn』
- \h :僅取主機名在第一個小數點之前的名字,如鳥哥主機則為『study』后面省略
- \t :顯示時間,為 24 小時格式的『HH:MM:SS』
- \T :顯示時間,為 12 小時格式的『HH:MM:SS』
- \A :顯示時間,為 24 小時格式的『HH:MM』
- @ :顯示時間,為 12 小時格式的『am/pm』樣式
- \u :目前使用者的賬號名稱,如『dmtsai』;
- \v :BASH 的版本信息,如鳥哥的測試主機版本為 4.2.46(1)-release,僅取『4.2』顯示
- \w :完整的工作目錄名稱,由根目錄寫起的目錄名稱。但家目錄會以 ~ 取代;
- \W :利用 basename 函數取得工作目錄名稱,所以僅會列出最后一個目錄名。
- # :下達的第幾個指令。
- $ :提示字符,如果是 root 時,提示字符為 # ,否則就是 $ 啰~
ps:更改參數可以修改成自己習慣的命令提示符 - $ 『關于本shell的PID』
- ? 『上個指令的回傳值』
- OSTYPE,HOSTTYPE,MACHTYPE 『主機硬件與核心等級』
- export 『自定義變量轉換為環境變量』
- locale 查看語系變量
配置文件在/etc/locale.conf
3.變量的有效范圍
環境變量可在bash以及子程序中使用。自定義的變量只能在愛自身中使用。可通過export將自定義變量變為環境變量。
read,array,declare
read [-pt] variable
-p:提示符
-t:等待的秒數
declare/typeset『宣告變量的類型』
declare [-aixr] variable
-a:定義為array類型
-i:定義為interger類型
-x:定義為環境變量
-r:定義為readonly,不可更改也不能unset
ps: 默認為字符串,bash中的數值運算只到整數形態。
array 一維數組
ulimit 文件系統與程序的限制關系
ulimit [-SHacdfltu] [配額]
選項與參數:
-H :hard limit ,嚴格的設定,必定不能超過這個設定的數值;
-S :soft limit ,警告的設定,可以超過這個設定值,但是若超過則有警告訊息。
在設定上,通常 soft 會比 hard 小,舉例來說,soft 可設定為 80 而 hard 設定為 100,那么你可以使用到 90 (因為沒有超過 100),但介于 80~100 之間時, 系統會有警告訊息通知你!
-a :后面不接任何選項與參數,可列出所有的限制額度;
-c :當某些程序發生錯誤時,系統可能會將該程序在內存中的信息寫成文件(除錯用),
這種文件就被稱為核心文件(core file)。此為限制每個核心文件的最大容量。 -f :此 shell 可以建立的最大文件容量(一般可能設定為 2GB)單位為 Kbytes
-d :程序可使用的最大斷裂內存(segment)容量; -l :可用于鎖定 (lock) 的內存量
-t :可使用的最大 CPU 時間 (單位為秒)
-u :單一用戶可以使用的最大程序(process)數量。
變量內容的刪除與替代
沒看懂 ...
別名與歷史命令
alias 與 unalias
alias ll="ls -al"
unalias ll
需要注意的是alias僅在當前的shell中生效,需要永久生效則需要更改 ~/.bashrc
history
history [n][-c]
history [-raw] histfiles
n:列出最近n筆命令
-c: 將當前的shell的history清空
-a: 將目前新增的history指令新增入histfiles中,沒有histfiles則謝雨~/.bash_history
-r: 將 histfiles的內容讀取到目前shell的history中
-w: 將目前的history寫入histfiles中。
!
!number !command !!
number: 執行第幾筆的意思
command: 最近的指令向前搜尋并執行
!!: 執行上一個指令
type -a command 查找指令搜尋順序,先找到哪個就以哪個執行。
/etc/issue,/etc/motd bash的進站與歡迎訊息,簡單提下 有興趣的再細看。
bash的環境配置文件
login-shell會讀取下面兩個文件
1. /etc/profile:這是系統整體的設定,你最好不要修改這個文件;(不過很多重要的設定都在這個文件里。) /etc/profile.d/*.sh 所有的.sh 文件都會被呼入,可以觀察下自己主機下有哪些腳本。
2. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:屬于使用者個人設定可以定制。依照順序讀取,
前一個存在則不會往后讀了。
source :讀入環境配置文件的指令 可以不登出直接讀取環境配置文件。
non-login shell 只會讀
~/.bashrc
/etc/man_db.conf 有時候說明文檔需要手動加進來,才能用man查看
~/.bash_history 歷史指令記錄
~/.bash_logout 注銷bash后,系統做了什么動作再離開。可做一些備份或整理工作。
stty、set 終端機的設定,不建議修改~ 還是適應標準比較好呢。
列一下終端機的熱鍵
Ctrl + c 終止當前命令
Ctrl + d EOF 輸入結束
Ctrl + m Enter
Ctrl + s 暫停屏幕輸出
Ctrl + q 恢復屏幕輸出
Ctrl + u 在提示字符下,將整列命令刪除
Ctrl + z 暫停 目前命令(不在屏幕上輸出)在后臺運行
Bash中的特殊符號
|符號 |內容 |
|-------|-----------:|
| # |批注符號:這個最常被使用在 script 當中,視為說明!在后的數據均不執行|
| \ |跳脫符號:將『特殊字符或通配符』還原成一般字符|
| | | 管線 (pipe):分隔兩個管線命令的界定(后兩節介紹)|
| ; |連續指令下達分隔符:連續性命令的界定 (注意!與管線命令并不相同)|
| ~ |用戶的家目錄|
| $ |取用變數前導符:亦即是變量之前需要加的變量取代值|
| & |工作控制 (job control):將指令變成背景下工作|
| ! |邏輯運算意義上的『非』 not 的意思!|
| / |目錄符號:路徑分隔的符號|
| > >> |數據流重導向:輸出導向,分別是『取代』與『累加』|
| < <<< |數據流重導向:輸入導向 (這兩個留待下節介紹)|
| '' |單引號,不具有變量置換的功能 ($ 變為純文本)|
| "" |具有變量置換的功能! ($ 可保留相關功能)|
| `` |兩個『 ` 』中間為可以先執行的指令,亦可使用 $( )|
| () |在中間為子 shell 的起始與結束|
| {} |在中間為命令區塊的組合!|
標準輸入輸出
0 標準輸入 < <<
1 標準輸出 > >>
2 標準錯誤輸出 2> 2>>
find /home -name .bashrc > list_right 2> list_error
/dev/null 垃圾桶黑洞裝置與特殊寫法
可以將錯誤信息丟到黑洞不予理會
2>&1 將錯誤輸出與輸出放置同一個文件,需要采用特殊寫法
> 表示覆蓋式輸出,>> 表示追加是輸出、
> <表示從文件讀取代替鍵盤輸入。而<<則很難理解了,表示結束的輸入字符。
> 如:<< "eof" 則表示遇到eof則終止輸入。
命令執行的判斷依據: ; , &&, ||
cmd ; cmd (不考慮指令相關性的連續指令下達)
$? (指令回傳值) 與 && 或 || 邏輯判斷符,根據命令回傳值決定執行那些命令,是一個相當好玩的指令
管線命令 (pipe)
? 管線命令僅會處理 standard output,對于 standard error output 會予以忽略
? 管線命令必須要能夠接受來自前一個指令的數據成為 standard input 繼續處理才行。
簡單來說就是管線命令前要有標準輸出的產生,命令后要能接受標準輸入。
管線命令后支持的命令大概有以下:
cut, grep, sort, wc, uniq, tee, tr, col, join, paste, expand, split, xargs
cut 主要的用途在于將『同一行里面的數據進行分解!』
# 試下這些命令你就知道什么意思了哦
export | cut -c 12-
# last 可以輸出『賬號/終端機/來源/日期時間』的數據,并且是排列整齊的
last | cut -d ' ' -f 1
grep 全文搜索 很好用的命令,多用就知道了!
grep [-acinv] [--color=auto] '搜尋字符串' filename
-a 將binary文件以text文件的方式搜尋數據
-c 計算找到'搜尋字符串'的次數
-i 忽略大小寫的不同
-n 順便輸出行號
-v 反向選擇,即顯示沒有'搜尋字符串'內容的文本
--color=auto 可以將找到的關鍵詞部分加上顏色的顯示
sort 排序
sort [-fbMnrtuk] [file or stdin]
-f 忽略大小寫
-b 忽略最前面的空白字符
-M 按月份的名字排序
-n 按照數字進行排序
-r 反向排序
-t 分隔符,預設是用 [tab] 鍵來分隔;
-u unique 相同的數據只展示一條
-k 以那個區間 (field) 來進行排序的意思
uniq
uniq [-ic]
-i 忽略大小寫
-c 計數
# 統計最近登錄的用戶次數
last | cut -d ' ' -f1 | sort | uniq -c
wc
wc [-lwm]
-l 僅列出行
-w 僅列出多少字
-m 多少字符
# 取得登入系統的總人次
last | grep [a-zA-Z] | grep -v 'wtmp' | grep -v 'reboot' | grep -v 'unknown' |wc -l
#由于 last 會輸出空白行, wtmp, unknown, reboot 等無關賬號登入的信息,因此,我利用 # grep 取出非空白行,以及去除上述關鍵詞那幾行,再計算行數
tee雙向重導向
tee 可以讓 standard output 轉存一份到文件內并將同樣的數據繼續送到屏幕去處理! 這樣除了可以 讓我們同時分析一份數據并記錄下來之外,還可以作為處理一份數據的中間暫存盤記錄之用。
tee [-a] file
-a 以append的方式,將數據加入file中
tr 可以用來刪除一段訊息當中的文字,或者是進行文字訊息的替換
tr [-ds] SET1 ...
-d 刪除訊息中SET1的字符串
-s 取代掉重復的字符
# 將last的輸出中小寫變大寫
last | tr '[a-z]' '[A-Z]'
#經常用來替換文件中奇怪的符號。
col
col [-xb]
-x: 將tab鍵轉換成對等的空格鍵
#利用 cat -A 顯示出所有特殊按鍵,最后以 col 將 [tab] 轉成空白
cat /etc/man_db.conf | col -x | cat -A | more
join 處理相關聯數據的好幫手
join [-ti12] file1 file2
-t join 默認以空格符分隔數據,并且比對『第一個字段』的數據,
如果兩個文件相同,則將兩筆數據聯成一行,且第一個字段放在第一個
-i 忽略大小寫
-1 第一個文件要用哪個字段
-2 第二個文件要用哪個字段
join -t ':' -1 4 /etc/passwd -2 3 /etc/group | head -n 3
# 使用join之前需要實現排序處理哦
paste 直接貼在一起,以[tab]鍵隔開
paste [-d] file1 file2
-d 默認的分隔符是tab 可指定
- 如果file部分寫成-,表示來自 standard input 的資料的意思
expand 將tab轉成空格
expand [-t] file
-t 后面可以接數字。一般來說,一個 tab 按鍵可以用 8 個空格鍵取代。
我們也可以自行定義一個 [tab] 按鍵代表多少個字符呢
#unexpand 將空格轉成tab
split
split [-bl] file PREFIX
-b :后面可接欲分區成的文件大小,可加單位,例如 b, k, m 等;
-l :以行數來進行分區。
PREFIX :代表前導符的意思,可作為分區文件的前導文字。
# 切割文件
cd /tmp; split -b 300k /etc/services services
# 復原為一個文件
cat services* >> servicesback
xargs
xargs [-0epn] command
-0 :如果輸入的 stdin 含有特殊字符,例如 `, \, 空格鍵等等字符時,這個 -0 參數
可以將他還原成一般字符。這個參數可以用于特殊狀態喔!
-e :這個是 EOF (end of file) 的意思。后面可以接一個字符串,當 xargs 分析到這個字符串時,
就會停止繼續工作!
-p :在執行每個指令的 argument 時,都會詢問使用者的意思;
-n :后面接次數,每次 command 指令執行時,要使用幾個參數的意思。 當 xargs 后面沒有接任何的指令時,默認是以 echo 來進行輸出喔!
# 很多指令其實并不支持管 線命令,因此我們可以透過 xargs 來提供該指令引用 standard input 之用
關于減號 - 的用途
tar -cvf - /home | tar -xvf - -C /tmp/homeback
# 我將 /home 里面的文件給他打包,但打包的數據不是紀錄到文件,而是傳送到 stdout; 經過管線后,將 tar -cvf - /home 傳送給后面的 tar -xvf - 』。后面的這個 - 則是取用前 一個指令的 stdout, 因此,我們就不需要使用 filename 了