shell前言 什麼是shell shell-‘殼’ 命令解釋器,一種應用程式 shell語言特點 SHELL語言是指UNIX操作系統的命令語言,同時又是該命令語言的解釋程式的簡稱。 Shell本身是一個用C語言編寫的程式,它是用戶使用Unix/Linux的橋梁,用戶的大部分工作都是通過Shell完 ...
shell前言
什麼是shell
shell-‘殼’ 命令解釋器,一種應用程式
shell語言特點
SHELL語言是指UNIX操作系統的命令語言,同時又是該命令語言的解釋程式的簡稱。
Shell本身是一個用C語言編寫的程式,它是用戶使用Unix/Linux的橋梁,用戶的大部分工作都是通過Shell完成的。
Shell既是一種命令語言,又是一種程式設計語言。作為命令語言,它互動式地解釋和執行用戶輸入的命令,作為程式設計語言,它定義了各種變數和參數,並提供了許多在高級語言中才具有的控制結構,包括迴圈和分支,它雖然不是Unix/Linux系統內核的一部分,但它調用了系統核心的大部分功能來執行程式、建立文件並以並行的方式協調各個程式的運行。因此,對於用戶來說,shell是最重要的實用程式,深入瞭解和熟練掌握shell的特性極其使用方法,是用好Unix/Linux系統的關鍵。
shell能做什麼
Shell 能做什麼?
1. 自動化批量系統初始化程式 (update,軟體安裝,時區設置,安全策略...)
2. 自動化批量軟體部署程式 (LAMP,LNMP,Tomcat,LVS,Nginx)
3. 應用管理程式 (KVM,集群管理擴容,MySQL,DELLR720批量RAID)
4. 日誌分析處理程式(PV, UV, 200代碼, !200代碼, top 100, grep/awk)
5. 自動化備份恢復程式(MySQL完全備份/增量 + Crond)
6. 自動化管理程式(批量遠程修改密碼,軟體升級,配置更新)
7. 自動化信息採集及監控程式(收集系統/應用狀態信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
8. 配合Zabbix信息採集(收集系統/應用狀態信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
9. 自動化擴容(增加雲主機——>業務上線)
zabbix監控CPU 80%+|-50% Python API AWS/EC2(增加/刪除雲主機) + Shell Script(業務上線)
10. 俄羅斯方塊,列印三角形,列印聖誕樹,列印五角星,運行小火車,坦克大戰,排序演算法實現
shell的執行方式
1 執行1:bash file1 2 執行2:sh file1 3 執行3:. file1 4 執行4: source file1
多種執行方式的區別:
1.準備環境
1 vim bash.sh 2 #!/usr/bin/bash 3 cd /home/ 4 ls
2. 一種執行方式測試
. bash.sh
3.觀察目錄改變了。說明影響的是當前。並使用子shell執行方式執行。
該種執行方式,是不同於前者SUB shell執行。
而是在當前shell執行,用於影響當前shell環境。
shell解釋器在哪
1 cat /etc/shells 2 或 3 chsh -l
變數
shell 變數? 用一個固定的字元串去表示不固定的內容,便於修改。
自定義變數
用戶自定義變數是最常用的變數類型,其特點是變數名和變數值都是由用戶自由定義的。
學習要點
定義變數: 變數名=變數值
引用變數: $變數名或 ${變數名}
查看變數: echo $變數名; "set"可以查看所有變數(包括自定義變數和環境變數)
取消變數: unset 變數名
定義變數
該如何定義變數呢?很簡單,只需執行"變數名=變數值"命令即可,不過要遵守變數定義規則。例如
1 [root@localhost ~]# name="test 666"
變數調用
當我們需要提取變數中的內容時,需要在變數名之前加入"$"符號。
那麼最簡單的變數調用就是通過 echo 命令輸出變數的值。命令如下
1 #定義變數name 2 3 [root@localhost ~]# name="test 666" 4 5 #輸出變數name的值 6 7 [root@localhost ~]# echo $name 8 9 test 666
錯誤定義示範
變數的定義就是這麼簡單,但是如果不遵守變數定義規則,就會報錯。比如:
#變數名不能以數字開頭 [root@localhost ~]# 2name="test 666" -bash: 2name=test 666: command not found #等號左右兩側不能有空格 #變數的值如果有空格,必須用引號包含 [root@localhost ~]# name=test 666 -bash: 666: command not found
重覆定義變數
重覆定義變數會進行變數疊加。例如:
#定義變數aa的值是123
#重覆定義變數aa的值是源aa的值加上456
1 [root@localhost ~]# aa="$aa"456 2 3 #調用變數aa,發現值已經變成了123456 4 5 #在進行變數疊加時,也可以使用${變數名}格式 6 7 [root@localhost ~]# aa=${aa}789 8 9 [root@localhost ~]# echo $aa 10 11 123456789
這裡要小心,在進行變數疊加時,變數名需要用雙引號或 ${} 包含。
變數查看
我們可以通過 echo 命令查詢已經設定的變數的值,這種查詢是已知變數名查詢變數值。
但是如果我不知道變數名,那麼可以查詢系統中已經存在的變數嗎?
[root@localhost ~]# set
變數刪除
1 [root@localhost ~]# aa="$aa"456 2 3 #調用變數aa,發現值已經變成了123456 4 5 #在進行變數疊加時,也可以使用${變數名}格式 6 7 [root@localhost ~]# aa=${aa}789 8 9 [root@localhost ~]# echo $aa 10 11 123456789
示例
使用變數前
需求:編寫測試主機線上的腳本。當主機線上提示線上,當主機不線上提示不線上。
編寫腳本
ping -c1 192.168.100.10 &> /dev/null && echo 192.168.100.10up || echo 192.168.100.10down
註釋:&&和||是三目表達式、&& 前面的命令成功。執行後面的命令、||前面的命令失敗。執行後面的命令
思考:如果更換測試IP。需要修改腳本的哪些部分?
需要修改三個部分
使用變數後
編寫腳本
1 #!/bin/bash 2 3 ip=192.168.100.10 4 5 ping -c1 $ip &>/dev/null && echo $ip up || echo "$ip down"
思考:添加變數後,修改一處即可。
交互定義變數
read 從鍵盤讀入變數值
賦值方式:read 變數名
示例
1 read -p "請輸入您測試的IP地址:" ip 2 3 ping -c1 $ip &>/dev/null && echo " $ip up" || echo "$ip 4 down"
註意事項:3種引號
定義或引用變數時註意事項:
" " 弱引用
' ' 強引用
` ` 優先執行
1 雙引號1 2 [root@localhost ~]# schoo=1000 phone 3 錯誤示範,shell把空格識別做命令分隔符。 4 bash: phone: 未找到命令 5 [root@localhost ~]# schoo="1000 phone" 6 正確示範,變數值中的空格,被轉義為一個普通符號 7 [root@localhost ~]# echo $schoo 8 1000 phone 9 執行成功。 10 11 雙引號2 12 [root@localhost ~]# schoo=$schoo is good 13 錯誤示範,已有變數的基礎上,再追加內容。 14 bash: is: 未找到命令 15 沒有加引號,被識別為兩條命令 16 [root@localhost ~]# schoo="$schoo is good" 17 正確示範,加了雙引號。組成了整體,空格失去含義。 18 [root@localhost ~]# echo $schoo 19 1000 phone is good 20 成功
1 單引號 2 [root@localhost ~]# schoo='$schoo 666' 3 單引號,轉義一切符號 4 [root@localhost ~]# echo $schoo 5 $schoo 666 6 $也被轉義了。一切都被轉義了。
1 反引號 2 [root@localhost ~]# schoo=`date` 3 反引號是優先執行。先執行date的命令,再執行定義變數。 4 [root@localhost ~]# echo $schoo 5 2022年 08月 23日 星期二 14:57:13 CST 6 所以看到變數的結果,是時間
註意
1.變數名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變數名的命名須遵循如下規則:
2.命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭。
3.中間不能有空格,可以使用下劃線(_)。
4.不能使用標點符號。
5.不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。
6.起變數名,請使用五個字母以上。
整數運算
1 方法一:expr 2 語法 3 expr 1 + 2 4 expr $num1 + $num2 5 +加 6 -減 7 \*乘(*是任意字元,使用\ 轉義一下。) 8 /除 9 %取餘 10 需求: 11 運算學員的成績總分 12 製作腳本 13 [root@localhost ~]# vim sum.sh 14 #!/bin/bash 15 read -p "請輸入您的第一門成績: " number1 16 read -p "請輸入您的第二門成績: " number2 17 echo -n "總成績是: " 18 expr $number1 + $number2 19 授權腳本 20 [root@localhost ~]# chmod +x sum.sh 21 測試腳本 22 [root@master1 ~]# ./sum.sh 23 請輸入您的第一門成績: 60 24 請輸入您的第二門成績: 70 25 總成績是: 130
小數運算(瞭解)
1 請提前安裝計算器程式bc 2 echo "2*4" |bc 3 echo "2^4" |bc 4 echo "scale=2;6/4" |bc 5 bc:交互運算器 6 scale=2 保留小數點後面兩位
環境變數(瞭解)
前言
自定義變數,只能再當前shell生效。其他shell是不生效的,說白了,你的變數只能你用。那如果有些變數,需要所有的用戶都使用,怎麼辦呢?
1 定義環境變數: 2 直接聲明 3 方法一 export back_dir2=/home/backup 4 聲明環境變數 5 轉換聲明 6 方法二 export back_dir1 將自定義變數轉換成環境變數 7 轉換環境變數
變數作用範圍: 在當前shell和子shell有效
想使變數。在當前用戶登陸後一直生效,可以將變數放到~/.bash_profile
想使變數。在所有用戶登陸後一直生效,可以將變數放到/etc/profile
1 示例 2 [root@localhost ~]# abc=123 3 定義普通變數1 4 [root@localhost ~]# def=456 5 定義普通變數2 6 [root@localhost ~]# bash 7 打開子shell 8 [root@localhost ~]# echo $abc 9 調用普通變數,失敗 10 [root@localhost ~]# echo $def 11 調用普通變數,失敗 12 [root@localhost ~]# exit 13 退出子shell 14 exit 15 [root@localhost ~]# export abc 16 講變數聲明為環境變數。兒子shell都能用。 17 [root@localhost ~]# bash 18 打開子shell 19 [root@localhost ~]# echo $abc 20 發現變數可以用了。 21 123 22 [root@localhost ~]# echo $def 23 普通變數還是不行。
位置變數和預定義變數(瞭解)
位置變數語法
1 位置變數 2 命令 參數1 參數2 參數3 ....9以後特殊定義 3 $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 ...
1 示例 2 需求 3 制定腳本程式,用戶自行輸入兩門學科的成績(整數),自動算出平均分。 4 製作腳本 5 [root@localhost ~]# vim avg.sh 6 #!/bin/bash 7 echo "($1+$2)/2" | bc 8 [root@localhost ~]# chmod +x avg.sh 9 測試腳本 10 [root@localhost ~]# ./avg.sh 88 77 11 82 12 請思考 13 位置變數和read讀取變數,到底用哪個? 14 使用誰都可以。 15 #!/bin/bash 16 read -p "請輸入您的第1門成績: " num1 17 read -p "請輸入您的第2門成績: " num2 18 echo -n "您的平均成績是:" 19 echo "($num1+$num2)/2" |bc
總結 1.位置變數就是$1,$2,$3,$4 2.位置變數預先已經被定義過了。 3.用戶使用時,必須攜帶參數。 4.位置變數不是程式設計的唯一方法。比如read也可以。
總結
這兩類變數,在設計系統時就已經定義好了。
需要使用時,直接調用即可。
練習
編寫自動創建用戶並設置初始化腳本
1 vim create.sh 2 #!/bin/bash 3 read -p "請輸入要創建用戶的名稱:" name 4 useradd ${name} 5 echo "123456" | passwd --stdin ${name} &> /dev/null 6 echo ${name} 已經創建完成,密碼是123456 7 [root@bogon ~]# sh create.sh 8 請輸入要創建用戶的名稱:kk 9 kk 已經創建完成,密碼是123456