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
文章列表