BASH入門

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 了
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。