6.1 shell基礎語法 6.1.1 shell的概述 shell的基本概念 shell的基本概念 1.什麼是shell shell是用戶和Linux操作系統之間的介面,它提供了與操作系統之間的通訊方式 shell是一個命令解釋器,它接收用戶發出的命令,然後調用相應的應用程式 shell是用戶和L ...
6.1 shell基礎語法
6.1.1 shell的概述
-
- shell的基本概念
1.什麼是shell
-
-
-
- shell是用戶和Linux操作系統之間的介面,它提供了與操作系統之間的通訊方式
- shell是一個命令解釋器,它接收用戶發出的命令,然後調用相應的應用程式
-
-
2.系統提供了哪些種類的shell
通過cat /etc/shells可查閱系統提供的shell
本文主要介紹/bin/bash,因為它相容於sh,它是依據使用者需求而對sh進行了加強
6.1.2 shell中的變數
-
- shell中變數的基本概念
1.什麼是變數
-
-
-
- 變數是值可以改變的量,在電腦中變數能存儲計算結果或者表示某一個值
- 例如:y = x + 1,其中y就是變數
-
- 變數的讀取
-
1.通過echo命令讀取
語法格式1: echo $變數名
語法格式2: echo ${變數名}
示例:
讀取登錄用戶名:echo $LOGNAME
讀取用戶home目錄:echo $HOME
讀取當前系統預設的shell:echo $SHELL
註意:當變數名後面連著其他符號時,為了避免不必要的錯誤建議使用格式2
-
- 環境變數的設置與查看
1.環境變數的查看
語法格式: env|more
設置環境變數使用set命令
-
- 將普通變數變為環境變數
1.通過關鍵字:export
語法格式1: export 變數名=變數值
語法格式2:變數名=變數值
export 變數名
-
- 局部變數的設置規則
1.變數與變數內容以一個等號"="連接,變數名=變數值
2.等號兩邊不能直接接空格符,如(變數名 = 變數值)這是錯誤的
3.變數名稱只能是英文字元、數字、下劃線組成,但是不能以數字開頭
4.變數內容若有空格符可使用雙引號或者單引號將變數內容結合起來
|-雙引號中的特殊字元保有原本的特性
|-例如:var="lang is ${LANG}",則echo $var的結果為lang is en_US.UTF-8
|-單引號中的特殊字元僅為存文本(一般字元),就類似java中的String類型的數據
|-例如:var='lang is ${LANG}',則echo $var的結果為lang is ${LANG}
5.可以使用轉義字元"\"將特殊符號(如$、\、!等)變為一般字元
6.如果變數的內容是由其他命令提供的,需要使用$(命令)來獲取變數的值
|-示例
-
- 變數的其他操作
1.為變數增加額外內容
示例:
2.取消變數的定義
語法格式: unset 變數名
示例:
註意:
如果取消系統的環境變數,需要修改/etc/profile文件,不然不生效
系統預設的變數通常變數名都為大寫,自定義的變數建議使用小寫,方便區分
-
- 把一個命令定義成一個變數
1.使用反引號(反引號為tab鍵上方的按鍵)
語法格式: 變數名=·命令名· (使用反引號包住命令)
示例:
由示例看出,這種方式變數的值就為命令獲取的值
2.使用圓括弧
語法格式: 變數名=(命令)
示例:
由示例看出,此種方式變數的值就是命令本身
-
- 變數總結
1.全局變數:
-
-
-
- 一般全大寫,比如環境變數
-
-
2.局部變數:
-
-
-
- 在腳本函數中的局部變數通常使用local修飾
- local I :表示變數i的有效範圍在該函數的內部有效
-
-
3.把一個命令定義成一個變數$(命令)或者·命令·
4.若變數和其他字元組成新的變數就需要個變數加上大括弧,否則容易出錯如${date}day
6.1.3 數據重定向
-
- 數據重定向概述
1.數據重定向的基本概念
-
-
-
- 數據重定向就是將某個命令執行後應該要出現在屏幕上的數據,給它傳輸到其他的地方
- 通常執行一條命令的時候會有標準輸出和標準錯誤輸出
- 標準輸出:是指命令執行之後,傳回正確信息的輸出目標
- 標準錯誤輸出:是指命令執行失敗後,所傳回錯誤信息的輸出目標
-
-
-
- 數據重定向的應用
1.數據重定向的命令及其對應的編號
數據重定向對應的編號
常用的組合命令及其含義
示例:將ls的輸出重定向到ls.log文件中
2.使用數據重定向的方式書寫內容到指定文件
語法格式: cat > filename << "EOF"
輸入此命令,此後所有的內容都會有">"提示輸入,直到輸入一個"EOF",才會關閉輸入流
示例:
3.使用數據重定向測試執行程式
對程式進行測試,就是看看能否執行成功,無需顯示執行過程和信息
示例:
示例中,/dev/null,叫做"黑洞",把數據輸出到此設備中,不會被保存,而是被丟棄
2>&1:表示無論是錯誤的還是正確的信息都輸出到/dev/null設備中
6.1.4 命令回傳值
-
- 命令回傳值概述
1.命令回傳值的基本概念
-
-
-
- 在Linux系統中,一個命令執行完之後,必然會有一個回傳值,作用是用於判斷命令是否執行成功
- 在Linux系統中,回傳值為0表示的含義就類型java中的true,其他數字均表示為false
- Linux中通過:echo $?,來獲取回傳值
-
- 命令回傳值的應用
-
1.Linux系統中的短路與(&&)和短路或(||)
短路與和短路或的應用
示例:判斷/temp/test是否存在,存在則創建/temp/test/test.txt
6.1.5 常用的shell命令
-
- 管道符及grep命令
1.管道命令的基本概念
-
-
-
- 在Linux系統中"|"表示管道符,用它來講兩個命令隔開
- 管道符左邊命令的輸出會作為管道符右邊命令的輸入
- 連續使用管道符就表示第一個命令的輸出會作為第二個命令的輸入,第二個命令的輸出又會作為第三命令的輸入,以此類推
-
-
2.grep命令
-
-
-
- 查看源系統解釋可知grep命令,是通過正則表達式搜索對應的文件或者是列印出來通過正則表達式匹配到的內容
-
-
3.示例
將ls查詢到的信息傳遞給grep命令進行搜索匹配文件夾名包含"ba"的內容
-
- find命令
1.find命令的功能
find命令能夠在一個目錄中搜索文件,可以指定匹配條件,比如按文件名,文件類型等
2.find命令及其常用選項
語法格式: find [目錄路徑] [選項] 參數
常用選項:
-
- sed命令
1.sed的基本概念
-
-
-
- sed是非互動式文本處理工具,在預設情況下,sed將所有輸出的行列印到屏幕上
- sed可以通過數據重定向的方式,將輸出的內容保存到某個文件里
-
-
2.sed逐行處理文件,並將結果發送到屏幕的具體過程
-
-
-
- sed把當前正在處理的行保存在一個臨時緩衝區
- 然後處理臨時緩衝區中的行,完成後把該行發送到屏幕上
- sed每處理完一行就將其從臨時緩衝區刪除,然後將下一行讀入,進行處理和顯示
- 處理完輸入文件的最後一行,sed變結束運行
- sed把每一行都存在臨時緩衝區中,然後對緩衝區這個副本進行編輯,所以源文件不會發生改變
-
-
3.sed命令的應用
語法格式: sed [選項] "[動作]" fileName
常用選項:
特殊選項:
示例:修改源文件,同時想要修改後的源文件的內容顯示在屏幕上
常用動作:
示例:sed "s/baiduhadoop/hadoop/g" demo.txt
註意:
想要修改源文件的內容,使用選項-i即可:sed -i "s/baiduhadoop/hadoop/g" demo.txt
如果向輸出到其他文件里:sed "s/baiduhadoop/hadoop/g" demo.txt > demo1.txt
示例:應用多條sed的動作進行文件內容的修改
方式1,通過-e選項:sed -e "s/h/H/g" -e "s/o/O/g" fileName
方式2,通過在引號中添加分號的形式:sed "s/h/H/g;s/o/O/g" fileName
-
- sort命令
1.sort命令的作用
-
-
-
- sort是將文件/文本的每一行作為一個單位,相互比較,比較原則是從首字元向後,依次按ASCII碼值進行比較
-
-
2.sort命令及其選項
語法格式: sort [選項] 參數
常用選項:
3.示例
預設排序:
指定的四段進行排序:
-
- cut命令
1.cut命令的作用
cut命令在文件中負責剪切數據用的,但是數據必須是有規則的數據
2.cut命名及其常用選項
語法格式: cut [選項] [參數] fileName
常用選項:
示例:
示例:剪切每一行的第5個到第7個位元組
示例:剪切每一行第6個位元組之後的內容
示例:剪切每一行,第6個位元組之前的內容
-
- history歷史命令
1.history命令的作用
該命令用於顯示歷史執行過的所有命令
2.歷史命令的一些執行命令
6.2 shell高級-腳本
6.2.1 shell script概述
-
- shell script的基本概念
1.什麼是shell script
shell script就是以固定語法組織起來的存文本文件
可以編譯這個文件,讓文件幫助我們一次執行多條命令
可以通過一些運算與邏輯判斷來達成較為複雜的功能
2.shell script的註意事項
命令的執行是從上而下,從左到右執行的
命令、選項和參數間的多個空格會被忽略
空白行也被忽略掉,tab被當成空格
"#"後面的內容為註釋,不會執行
如果讀取一個Enter符號,就會嘗試開始執行該行命令
-
- shell script如何執行
1.直接執行
假設程式文件名是:/home/shell.sh(該文件必須是可讀可執行的許可權(rx))
通過絕對路徑:運行/home/shell.sh
通過相對路徑:先cd到/home/,使用./shell.sh 執行
2.通過source執行
假設程式文件名是:/home/shell.sh(該文件必須是可讀可執行的許可權(rx))
語法格式:source /home/shell.sh
3.通過sh執行
假設程式文件名是:/home/shell.sh(該文件必須是可讀可執行的許可權(rx))
語法格式:sh /home/shell.sh
6.2.2 shell腳本的編寫
-
- 編寫一個互動式腳本
1.提示用戶輸入兩個數字,然後對這兩個數字進行相乘,給用戶返回結果
#!/bin/bash
#告訴用戶本程式的功能,並且引導用戶進行內容的輸入
echo "您好,請輸入兩個數字,我將對這兩個數字進行乘法運行,給您返回結果!"
#引導用戶輸入
read -p "請輸入第一個數字:" num1
read -p "請輸入第二個數字:" num2
#計算結果,並返回
mul=$(($num1*$num2))
echo "您輸入的兩個數字${num1}*${num2}的結果是${mul}"
代碼執行的結果:
以上腳本解析:
-
-
-
- 第一行#!/bin/bash,告訴系統如何執行腳本。當採用直接執 行(不是用類似sh xxx.sh這樣的方式)時,此行必須有,且要放在首行。
- 除了第一行的之外#都是註釋,其他為程式部分。
- read -p "提示信息" 變數名,用於給客戶進行信息提示,用戶輸入的結果作為變數的值
- echo 後面為返回值,返回到屏幕
-
- test判斷命令
-
1.test命令及其選項
語法格式:test [選項] 參數
常用選項:
2.test判斷字元串