文章出處

linux之bash腳本,學習編程語言的方法(編寫 - 文本編輯器):

了解要學的編程語言的特性(語言類型)

SHELL:自動化管理系統/文本處理

搭建語言環境(解析器/編譯器的安裝)

SHELL: bash(解析器)

研究語言的編程入口(hello world)

hello world打印出來,證明此語言的編程入口的熟悉(怎么編輯 是否編譯 怎么運行)

研究變量(變量定義 數據類型)

常量

操作符(運算符)

基本輸入輸出操作

研究流程控制(分支 循環)

研究函數(后期維護成本 函數式編程)

研究數組(類似數組的存儲)

類和對象(代碼擴展)

Bash SHELL Script:

變量(類型 一切皆于字符串)

命名通用規則:

數字、字母和特殊字符組合

嚴格區分大小寫

不能以數字開頭

大部分的特殊字符也不能開頭(_)

命名能盡量描述變量的作用

建議使用(首字母小寫)駝峰命名表示

定義變量

變量名=變量的值

=兩邊不能有任何其它字符(空格)

變量的賦值

變量名=變量的新值

變量訪問

$變量名

${變量名}

變量的銷毀

unset 變量名

變量的分類:

普通變量

環境變量

預先存儲操作系統的某些信息,使應用程序不需要與操作系統通信就能獲取這些信息,提高應用程序的運行效率

還有一個作用是給子進程傳參

env 列出當前系統所有環境變量

PATH

存儲可執行文件路徑,以冒號為分隔符,可以設置多個路徑

shell程序會根據此環境變量去查找可執行文件

把可執行文件路徑加入到此環境變量中,此可執行文件可以在任何位置都可以執行

環境變量的定義與普通變量的區別:

export PATH=$PATH:/kyo/shell

普通變量可以轉換為環境變量:

export 普通變量名

環境變量與普通變量的區別:

環境變量會影響子進程,普通變量不會影響子進程

子進程會復制父進制的環境變量

運行腳本默認會創建一個子進程去運行

使用source 或 . 內部命令來運行腳本會使用當前進程來執行

注釋語句在命令前加#

變量的特殊訪問方式:

# 分隔符可以是一個字符也可以是一個字符串

echo '${path%/*}: '${path%/*}

# % 截取字符串指定最后的分隔符前面字符串

# 格式: ${變量名%分隔符*}

echo '${path%%/*}: '${path%%/*}

# %% 截取字符串指定第一個分隔符前面字符串

# 格式: ${變量名%%分隔符*}

echo '${path#*share}: '${path#*share}

# # 截取字符串指定第一個分隔符后面字符串

# 格式: ${變量名#*分隔符}

echo '${path##*share}: '${path##*share}

# ## 截取字符串指定最后的分隔符后面字符串

# 格式: ${變量名##*分隔符}

echo '${path:3:5}: ' ${path:1:5}

# 按指定起始位置指定長度去截取字符串

# 格式: ${變量:起始值:長度}

# 起始值從0開始計數

echo '${path//share/KYO}: '${path//share/KYO}

替換操作:

${變量/被替換的字符串/替換后的字符串}

替換變量值的第一個關鍵詞

${變量//被替換的字符串/替換后的字符串}

替換變量值的所有關鍵詞

獲取變量值的長度: ${#變量名}

結束腳本執行: exit

練習:

通過腳本獲取本機正在使用的IP地址(統一截取英文終端的IP)

修改當前終端語言環境: export LANGUAGE=en_US.en

Bash Shell內置變量:

$0 運行腳本本身路徑

$1 ~ $n 腳本的參數 $1代表第一個參數 $2代表第二個參數 以此類推

到了2位數的參數必須使用大括號來訪問

$* 存儲腳本所有參數

$@ 存儲腳本所有參數

$*和$@功能一樣,但對此變量加雙引號就有區別, $*代表一個參數, $@會保持參數個數

$$ 獲取當前進程的PID

$? 獲取上一條命令的返回值(0代表正確 非0代表錯誤)

shift 內部命令, 刪除腳本指定個數的參數 會重新給$1 ~ $n賦值

簡單的輸入輸出:

輸出: echo / printf / write

輸入: read

-p 指定輸入提示信息

read后面可以跟變量名,將輸入寫入到變量中

read后面可以跟多個變量名, 以空格分隔符分別寫入

-n 限制用戶輸入字符長度

-s 關閉回顯, 不顯示用戶輸入內容

-t 限制用戶輸入的時間(秒)

Bash Shell執行順序:

; 一條命令的結束符(一行當中可寫多條命令)

&& &&前面的命令執行成功才會執行&&后面的命令

|| ||前面的命令執行失敗才會執行||后面的命令

! 除非, 在命令前加將命令結果除非

Bash Shell的流程控制:

分支

if

if的語法:

if 命令

then

執行代碼1

elif 命令

then

執行代碼2

....

else

執行代碼n

fi

if表達式表示方式: [] / test

獲取 if表示式的幫助: man test

字符串比較: = !=

整型比較: -eq -ne -le -lt -ge -gt

case 多選一

語法:

case "變量" in

值1)

代碼1

;;

值2)

代碼2

;;

值3)

代碼3

;;

...

*)

代碼n

;;

esac

[:alnum:] 字母數字

[:blank:] 空格或制表符

[:digit:] 純數字

[:lower:] 小寫字母

[:upper:] 大寫字母

[:punct:] 標點符號

循環

循環控制語句

continue 跳過本次循環

break 退出循環

for 當確定循環次數時候使用

for的語法:

for 迭代變量 in 空格為分隔符,分隔多少就循環多少次

do

echo $迭代變量

done

while

while的語法:

命令結果為真繼續循環

while 命令

do

循環代碼

done

until

until的語法與while一樣

命令結果為假繼續循環

select 封裝菜單

select 臨時變量 in 以空格為分隔符填寫菜單名

do

echo $臨時變量

done

延時: sleep

延時1秒

sleep 1

延時1毫秒

sleep 0.001

隨機數: $RANDOM

取100以內的隨機數: $[RANDOM % 100]

取50到100之間的隨機數: $[RANDOM % 51 + 50]

正則表達式(字符串處理: 查找/替換)

用一堆特殊符號來表示一個字符串

. 一個任意字符

* 不能單獨使用,組合使用

a* 匹配連續a零次或n次

沒有a的字符串和一個a或連續多個a都匹配

.* 代表所有

+ 不能單獨使用,組合使用

a+ 匹配連續a 至少一次或n次

? 不能單獨使用,組合使用

a? 匹配a零次或1次

\ root\> 以root結尾的單詞

\ 完全匹配root單詞

^ 以什么開頭

^root 以root開頭

$ 以什么結尾

root$ 以root結尾

[] 匹配一個指定字符

[abc] 匹配a或b或c的單一字符

[a-z] 匹配a到z 26個小寫英文字母任意一個字符

[0-9] 匹配0-9任意一個數字

[a-z0-9A] 匹配a到z或0到9或A任意一個字符

[^abc] 匹配不是a b c的任意字符

{} 匹配指定次數

a{3,5} 匹配連續有3到5個a

a{3,} 匹配連續至少3個a

a{3} 匹配連續3個a

\ 脫義符

| 或

abc|123 匹配abc或123

egrep sed awk支持正則表達式

I/O:

0 stdin 標準輸入 讀

1 stdout 標準輸出 寫

2 stderr 錯誤輸出 寫

重定向:

輸出重定向 > >> 1> 2> 1>> 2>> &>> &> >& >>&

> 清空目標(目標一般指文件)

>> 追加到目標

& 標準輸出和錯誤輸出全部重定向

輸入重定向 < << <<<

< 將文件內容作為輸入

<< 將指定的結束符之前的內容作為輸入

<<< 將字符串作為輸入

函數

語法:

函數的定義:

[function] 函數名() {

函數體代碼

}

函數的調用

函數名 [參數列表]

函數的參數

實參 函數調用時后面的參數

形參 函數里訪問$1 ~ $n

函數里訪問$1 到 $n 即訪問函數的參數

函數調用時在函數名后以空格為分隔符傳遞函數的參數

函數的返回值

在函數中使用return進行返回值

函數返回值只能返回0 - 255

函數返回值只是返回函數錯誤碼

獲取函數返回值也是使用$?

shell定義的變量默認為全局變量

在函數調用前定義的變量可在函數內訪問及修改

在函數里定義的變量也可在函數調用后訪問及修改

定義局部變量: 使用local關鍵詞修飾變量

local c="local var"

想要從函數里獲取更多的信息

在函數中輸出要返回的信息

在調用時使用重定向到變量中

v=$(函數名 參數列表)

可把函數當作命令來使用

作業:

1. 使用三種循環打印9x9乘法表(對齊)

2. 實現猜數字游戲

3. 實現腳本傳參判斷用戶是否在本系統存在

4. 實現隨機播放列表腳本

5. 實現網絡檢測腳本

6. 實現網絡自動修復腳本

7. 實現教師機數據同步腳本 (容錯機制)

cp -u

8. 實現菜單打印四種直角三角形 (函數封裝)

輸出: 3

結果:

*

* *

* * *

9. 實現腳本檢測ssh登錄(通過傳參可踢下線并且記錄)

10. 處理以下文件內容,將域名取出并進行讀數排序

http://www.baidu.com/index.html

http://www.baidu.com/1.html

http://post.baidu.com/index.html

http://mp3.baidu.com/index.html

http://www.baidu.com/3.html

http://post.baidu.com/2.html

處理結果:

3 www.baidu.com

2 post.baidu.com

1 mp3.baidu.com

11. 已知1900年1月1號是星期一, 計算今年有多少個黑色星期五(13號是星期五)

看文倉www.kanwencang.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20170301/108842.html

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()