Shell 编程进阶笔记
這幾篇博文主要記錄博主的Linux 學習之路,用作以后回顧和參考。大家可以選擇略過也可以作參考。
(一)Linux 初步筆記
(二)Linux 進階筆記(一)
(三)Linux 進階筆記(二)
(四)Shell 編程進階筆記
Shell 變量
(一)bash 變量與變量分類
變量的分類:
- 用戶自定義變量:用戶根據自己的需求定義的變量可以根據需求修改
- 環境變量:主要保存的是和系統操作環境相關的數據,對系統生效的環境變量名和變量作用是固定的
- 位置參數變量:這種變量主要是用來向腳本當中傳遞參數或數據的,變量名不能自定義,并且作用是固定的
- 預定義變量:是bash 中已經定義好的變量,變量名不能自定義,并且作用是固定的
用戶自定義變量:
[變量名]=[變量值] : -> 注意兩邊不要有空格,如果變量中有空格需要加雙引號
echo $[變量名] : -> 變量調用
[變量名]=“$[變量名]”[疊加值] : -> 變量的疊加
[變量名]=${[變量名]}[疊加值] : -> 變量的疊加
set : -> 所有變量的查看
set -u : -> 執行此命令后如果調用未聲明的變量時會報錯
unset [變量名] : -> 刪除變量
bash 環境變量:
export [變量名]=[變量值] : -> 定義一個環境變量
env : -> 查看環境變量
環境變量與自定義變量的區別:
??????環境變量時全局變量,而用戶自定義變量是局部變量。用戶自定義的變量只在當前的Shell 中生效,環境變量會在當前Shell 和這個Shell 的子Shell 中生效。環境變量可以自定義,但是對系統生效的環境變量是固定的。
位置參數變量:
預定義變量:
bash 語系變量:
locale : -> 查看當前系統語系
echo $LANG : -> 輸出系統當前語系
(二)接收鍵盤輸入
相關命令:
read [選項] [變量名]
選項:
- -p “提示信息” : -> 在等待輸入之前進行信息提示
- -t [秒數] : -> 在等待用戶輸入的時候,防止一直等待輸入
- -n [字符數] : -> read 命令只接收指定的字符數,接收完成便會進行下一步
- -s : -> 隱藏輸入的數據,就像終端輸入用戶密碼一樣
Shell 運算符
(一)declare 聲明變量類型
declare [+/-] [選項] [變量名]=[變量值]
選項:
- -:給變量設定類型屬性
- +:取消變量的類型屬性
- -a:將變量聲明為數組
- -i:將變量聲明為Integer 類型
- -x:將變量聲明為環境變量,和export 作用類似
- -r:將變量聲明為只讀屬性
declare -p : ->查詢所有變量的屬性
declare -p [變量名] : -> 查詢指定變量的屬性
一個簡單的小應用實現運算:
[root@localhost ~]# declare -i a=1 [root@localhost ~]# declare -i b=2 [root@localhost ~]# declare -i sum=$a+$b [root@localhost ~]# echo $sum 3(二)數值運算的方法
一:如上使用declare 將變量聲明為Integer 類型再進行運算
二:使用 expr 或let 進行運算
三:”((運算式))”或“$[運算式]”
[root@localhost ~]# e=$(( $a + $b )) [root@localhost ~]# echo $e 5Shell 編程之環境變量配置文件
source 相關命令
source [配置文件] : ->修改系統配置文件后,必須注銷用戶才可以生效,使用source 命令不用注銷重新登錄用戶
. [配置文件]
放張圖在這里供以后作參考
Shell 編程之正則
(一)正則表達式
正則表達式與通配符的區別:
- 正則表達式用來在文件中匹配符合條件的字符串,是包含匹配。grep、awk、sed、等命令支持正則表達式
- 通配符用來匹配符合條件的文件名,通配符是完全匹配。
正則匹配規則:
(二)字符串截取
cut 相關命令:
cut [選項] [文件名]
選項:
- -f [列號] : -> 提取第幾列的數據
- -d [分隔符] : -> 指定按照指定分隔符截取數據,默認使用制表符截取數據
簡單例子:
[root@localhost ~]# grep "/bin/bash" /etc/passwd root:x:0:0:root:/root:/bin/bash Jas:x:500:500:Jas Zhang:/home/Jas:/bin/bash[root@localhost ~]# grep "/bin/bash" /etc/passwd | grep -v "root" Jas:x:500:500:Jas Zhang:/home/Jas:/bin/bash[root@localhost ~]# grep "/bin/bash" /etc/passwd | grep -v "root" | cut -f 1 -d ":" Jasawk 相關命令:
awk ‘[條件一]{[動作一]}[條件二]{[動作二]}…’ [文件名]
條件(Pattern ): 一般使用關系表達式作為條件
動作(Action): 一般用于格式化輸出
簡單示例一(沒有執行條件):
[root@localhost ~]# df -h 文件系統 容量 已用 可用 已用%% 掛載點 /dev/sda5 17G 5.2G 11G 33% / tmpfs 499M 276K 499M 1% /dev/shm /dev/sda1 194M 28M 156M 16% /boot /dev/sda2 2.0G 240M 1.6G 13% /home /dev/sr0 4.0G 4.0G 0 100% /media/CentOS_6.3_Final [root@localhost ~]# df -h | awk '{print$1 "\t" $2}' 文件系統 容量 /dev/sda5 17G tmpfs 499M /dev/sda1 194M /dev/sda2 2.0G /dev/sr0 4.0G簡單示例二(帶有執行條件):
[root@localhost ~]# df -h | awk 'BEGIN{print "check begin"} {print$1 "\t" $2} END{print "check end"}' check begin 文件系統 容量 /dev/sda5 17G tmpfs 499M /dev/sda1 194M /dev/sda2 2.0G /dev/sr0 4.0G check end簡單示例三(FS內置對象指定分隔符,并使用BEGIN 條件)
[root@localhost ~]# cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"} {print $1 "\t" $2}' root:x:0:0:root:/root:/bin/bash Jas x[root@localhost ~]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"} {print $1 "\t" $2}' root x Jas xsed 相關命令:
sed [選項] ‘[動作]’ [文件名]
選項:
- -n :一般sed 命令會把所有的數據都輸出到屏幕上,-n 只會把經過sed 命令處理后得到的數據進行輸出
- -e :允許對輸入數據應用多條sed 命令編輯
- -i :用sed 命令的修改結果直接修改原文件,而不再輸出到屏幕
動作:
- a :追加,在當前行后追加一條或多條數據
- c :行替換
- i :插入,在當前行前插入一條或多條數據
- d :刪除指定行
- p :打印輸出指定的行數據
- s :字符串替換,用一個字符串代替另一個字符串
簡單示例:
[root@localhost ~]# df -h 文件系統 容量 已用 可用 已用%% 掛載點 /dev/sda5 17G 5.2G 11G 33% / tmpfs 499M 276K 499M 1% /dev/shm /dev/sda1 194M 28M 156M 16% /boot /dev/sda2 2.0G 240M 1.6G 13% /home /dev/sr0 4.0G 4.0G 0 100% /media/CentOS_6.3_Final [root@localhost ~]# df -h | sed -n '1p' 文件系統 容量 已用 可用 已用%% 掛載點(三)字符處理
sort排序命令:
sort [選項] [文件名]
選項:
- -f :忽略大小寫
- -n :以整型數值排序,默認使用字符串排序
- -r :反向排序
- -t :指定分隔符,默認的分隔符是制表符
- -k “m,n”:按照指定的字段范圍進行排序
簡單示例:
[root@localhost ~]# df -h | sort /dev/sda1 194M 28M 156M 16% /boot /dev/sda2 2.0G 240M 1.6G 13% /home /dev/sda5 17G 5.2G 11G 33% / /dev/sr0 4.0G 4.0G 0 100% /media/CentOS_6.3_Final tmpfs 499M 276K 499M 1% /dev/shm 文件系統 容量 已用 可用 已用%% 掛載點[root@localhost ~]# df -h | sort -r 文件系統 容量 已用 可用 已用%% 掛載點 tmpfs 499M 276K 499M 1% /dev/shm /dev/sr0 4.0G 4.0G 0 100% /media/CentOS_6.3_Final /dev/sda5 17G 5.2G 11G 33% / /dev/sda2 2.0G 240M 1.6G 13% /home /dev/sda1 194M 28M 156M 16% /boot[root@localhost ~]# df -h | sort -n -k "5,5" 文件系統 容量 已用 可用 已用%% 掛載點 tmpfs 499M 276K 499M 1% /dev/shm /dev/sda2 2.0G 240M 1.6G 13% /home /dev/sda1 194M 28M 156M 16% /boot /dev/sda5 17G 5.2G 11G 33% / /dev/sr0 4.0G 4.0G 0 100% /media/CentOS_6.3_Final wc 統計命令:wc [選項] [文件名]
選項:
- -l :只統計行數
- -w :只統計單詞數
- -m :只統計字符數
Shell Script
(一)簡單if 條件語句
簡單用例(一):判斷當前用戶是不是root
[root@localhost ~]# echo $USER root [root@localhost ~]# vim test.sh #!/bin/bash test=$USERif [ "$test" == "root" ]thenecho "I'm root" elseecho "I'm not root" fi[root@localhost ~]# bash test.sh I'm root簡單用例(二):判斷用戶輸入的字符串是不是一個目錄
[root@localhost ~]# vim test.sh #!/bin/bash read -p "please input a dir: " dirif [ -d "$dir" ]thenecho "It's a dir" elseecho "It's not a dir" fi[root@localhost ~]# bash test.sh please input a dir: /root It's a dir [root@localhost ~]# bash test.sh please input a dir: /root123 It's not a dir(二)case 語句
簡單用例:
[root@localhost ~]# vim test.sh#!/bin/#!/bin/bash# 練習 case 語句的使用read -p "Please confirm to formate the disk (Y/N) : " inputcase "$input" in"Y") echo 'Your choosen is Y';;"N") echo 'Your choosen is N';;*)echo 'Error!' ;;esac[root@localhost ~]# bash test.sh Please confirm to formate the disk (Y/N) : Y Your choosen is Y [root@localhost ~]# bash test.sh Please confirm to formate the disk (Y/N) : N Your choosen is N [root@localhost ~]# bash test.sh Please confirm to formate the disk (Y/N) : a Error!(三)for 語句
簡單用例(求和):
[root@localhost ~]# vim test.sh#!/bin/#!/bin/bashsum=0for(( i=0;i<=100;i++))dosum=$(( $sum+$i ))doneecho $sum[root@localhost ~]# bash test.sh 5050(四)while 與 until 語句
while 與 until 語句的區別是while 中的條件判斷為真時才進行循環,until 是判斷條件為假時進行循環
總結
以上是生活随笔為你收集整理的Shell 编程进阶笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广发银行信用卡额度是多少 金卡额度为10
- 下一篇: 在农村开熟食店怎么样 经济好了消费也上去