前言:
- shell腳本編程規範
- shell腳本應用場景
- shell編程規範
- 管道與重定向
- shell腳本變量揭祕
- 自定義變量
- 特殊變量
本次學習瞭解的是變量
語言分爲兩大類
1.強語言:定義變量的時候需要聲明數據類型,一旦聲明,就不可變 jave c語言
1整型 init 1 2 3 100
長整型 long
2浮點型 單精度 float 4字節
雙精度 double 8字節
帶小數點就是浮點型
3.string 字符串
char 字符 英文字母字符 a 佔一個字節
中文漢字字符,男 佔兩個字節
而在java中,所有字符都佔兩個字節
4 boolean 布爾值 ture 和false
5 date 日期
int a=10; a
弱語言 :shell javascript python 不需要聲明
a=10;
a=10.1;
給a賦予任意含義,都可以
html 標記語言 以標籤形式存在,
<head><haed>
<img src="">
xml文件格式
json 鍵:值 key:value a:10;
shell 優點:
變量直接定義,不需要聲明,沒有面向對象思想,所有的語言編寫猶如記流水賬
數組 函數
一 : shell腳本概述
1.1 shell腳本的概念
- 將要執行的命令按照順序保存到一個文本文件
- 給該文件可執行的權限,便於運行 +一個x的執行權限
- 可結合各種shell控制語句以完成更復雜的操作
1.2 shell腳本應用場景
- 重複性操作
- 批量化事務處理
- 自動化運維管理
- 服務器運行狀態監控
- 定時任務執行
- ······
首先要先把命令記熟,和語句
二 : shell的作用
2.1 shell的作用——命令解釋器,“翻譯官”
- 介於系統內核與用戶之間,負責解釋命令行
2.2 用戶的登陸shell
- 登陸後默認使用的shell程序,一般爲/bin/bash
- 不同shell的內部命令、運行環境等會有所區別
[root@localhost ~]# cat /etc/shells
/bin/sh
'/bin/bash'
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@localhost ~]#
三 :編寫第一個shell腳本
3.1 編寫腳本代碼
- 使用vi文本編輯器
- 每行一條Linux命令,按執行順序依次編寫
t@localhost ~]# vi frist.sh
#!/bin/bash 'shell腳本固有格式'
cd /boot/
pwd
ls -lh vml*
[root@localhost ~]# chmod 744 frist.sh
[root@localhost ~]# ./frist.sh
/boot
-rwxr-xr-x. 1 root root 5.7M 10月 23 13:40 vmlinuz-0-rescue-33c124456fa34c50a98483245dfea58d
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
;表示一句話的結束,可以使用分號同時使用兩條命令
[root@localhost boot]# ls;who ‘命令用分號隔開可以同時執行兩個命令’
config-3.10.0-693.el7.x86_64
efi
grub
grub2
initramfs-0-rescue-33c124456fa34c50a98483245dfea58d.img
initramfs-3.10.0-693.el7.x86_64.img
initrd-plymouth.img
symvers-3.10.0-693.el7.x86_64.gz
System.map-3.10.0-693.el7.x86_64
vmlinuz-0-rescue-33c124456fa34c50a98483245dfea58d
vmlinuz-3.10.0-693.el7.x86_64
root :0 2019-11-25 13:43 (:0)
root pts/0 2019-11-25 17:06 (:0)
3.2 執行腳本文件 ./
- 方法一:腳本文件路徑(絕對路徑與相對路徑)
[root@localhost ~]# ./frist.sh
- 方法二: sh 腳本文件路徑
[root@localhost ~]# sh frist.sh
/boot
-rwxr-xr-x. 1 root root 5.7M 10月 23 13:40 vmlinuz-0-rescue-33c124456fa34c50a98483245dfea58d
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@localhost ~]#
- 方法三 : source 腳本文件路徑
[root@localhost ~]# source frist.sh
/boot
-rwxr-xr-x. 1 root root 5.7M 10月 23 13:40 vmlinuz-0-rescue-33c124456fa34c50a98483245dfea58d
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@localhost boot]#
./ 此方法的文件必須要有執行x權限
sh 執行 ,當前路徑無變化
source 執行,當前路徑有變化
3.3 更完善的腳本構成
- 腳本聲明
- 註釋信息
- 可執行語句
[root@localhost ~]# vim frist.sh
#!/bin/bash
#this is my frist shell-script.
cd /boot/
echo “當前的目錄位於:” '輸出友好提示信息'
pwd
echo “其中以vml開頭的文件包括:”
ls -lh vml*
~
echo 代表輸出語句,輸出字符串用雙引號
[root@localhost ~]# ./frist.sh
當前的目錄位於:
/boot
其中以vml開頭的文件包括:
-rwxr-xr-x. 1 root root 5.7M 10月 23 13:40 vmlinuz-0-rescue-33c124456fa34c50a98483245dfea58d
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
四 : 重定向與管道操作
4.1 交互式硬件設備 0 1 2
- 標準輸入:從該設備接受用戶輸入的數據
- 標準輸出:通過該設備向用戶輸出數據
- 標準錯誤:通過該設備報告執行出錯信息
4.2 重定向操作 >
重定向符號可以用來寫日誌文件
[root@localhost ~]# chattr +i /etc/passwd '給賬號文件加鎖'
[root@localhost ~]# lsattr /etc/passwd '查看已枷鎖'
----i----------- /etc/passwd
[root@localhost ~]# useradd zhaoyun '測試'
useradd:無法打開 /etc/passwd '標準錯誤輸出'
[root@localhost ~]# useradd zhaoyun 2> err.txt '使用2>重定向'
[root@localhost ~]# ls
anaconda-ks.cfg frist.sh test.sh 模板 圖片 下載 桌面
err.txt initial-setup-ks.cfg 公共 視頻 文檔 音樂
[root@localhost ~]# cat err.txt '查看'
useradd:無法打開 /etc/passwd
4.3 管道操作符號“|”
- 將左側的命令輸出結果,作爲右側命令的處理對象
'cmd1 | cmd2 [... | cmdn]
[root@localhost ~]# grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
gsy:x:1000:1000:gsy:/home/gsy:/bin/bash
[root@localhost ~]# grep "bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
gsy /bin/bash
[root@localhost ~]#
正則表達式三劍客
grep egrep 老大 過濾關鍵字
sed 老二 按行讀取
awk 老三 按列讀取數據
awk -F 指定分隔符 如果不加-F,則默認分隔符爲製表符或空格
'{print 打印 $1 第一個參數 $7 第七個參數}'
$1 $2 代表位置變量
[root@localhost ~]# df -Th
文件系統 類型 容量 已用 可用 已用% 掛載點
/dev/mapper/centos-root xfs 20G 7.6G 13G 38% /
devtmpfs devtmpfs 977M 0 977M 0% /dev
tmpfs tmpfs 993M 0 993M 0% /dev/shm
tmpfs tmpfs 993M 9.0M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sda1 xfs 6.0G 161M 5.9G 3% /boot
/dev/mapper/centos-home xfs 10G 37M 10G 1% /home
tmpfs tmpfs 199M 20K 199M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
[root@localhost ~]# df -Th | awk '{print $1,$2,$6}'
文件系統 類型 已用%
/dev/mapper/centos-root xfs 38%
devtmpfs devtmpfs 0%
tmpfs tmpfs 0%
tmpfs tmpfs 1%
tmpfs tmpfs 0%
/dev/sda1 xfs 3%
/dev/mapper/centos-home xfs 1%
tmpfs tmpfs 1%
/dev/sr0 iso9660 100%
五 : shell變量的作用、類型
5.1 變量的作用
- 爲靈活管理limux系統提供特定參數,有兩層意思
- 變量名:使用固定的名稱,由系統預設或用戶定義
- 變量值:能夠根據用戶設置、系統環境的變化而變化
- 變量的類型
- 自定義變量:由用戶自己定義、修改和使用
- 環境變量:由系統維護,用於設置工作環境
- 位置變量:通過命令行給腳本程序傳遞參數
- 預定義變量:Bash中內置的一類變量,不能直接修改
5.2 定義一個新的變量——自定義變量 = echo
-
變量名以字幕或下劃線開頭,區分大小寫,建議全大寫
- 變量名=變量值
-
查看變量的值
- echo $變量名
[root@localhost ~]# addr=192.168.100.100
[root@localhost ~]# echo $addr
192.168.100.100
[root@localhost ~]# addr=10
[root@localhost ~]# echo $addr
10
[root@localhost ~]# num=$addr
[root@localhost ~]# addr=20
[root@localhost ~]# echo $addr $num
20 10
[root@localhost ~]# product=puthon
[root@localhost ~]# version=3.7
[root@localhost ~]# echo $product $version
puthon 3.7
[root@localhost ~]# echo $product2.8 ’當變量名與數字連起來時,則不顯示‘
.8
[root@localhost ~]# echo $product 2.8
puthon 2.8
[root@localhost ~]#
[root@localhost ~]# echo ${product}2.8 '想要的出來的結果與數字連在一起,就需要用上{}符號'
puthon2.8
=號是賦值符號,把右邊的值賦予給左邊的值
addr="192.168.100.100";
_abc="hello";
變量開頭不可以以數字和漢字爲開頭,只可以爲字母或者下劃線
java的命名方法叫字下美人數駱駝
駱駝是駱駝命名法
輸出時,要把變量前面加$符號
變量賦值相當於在內存中開闢了一個存儲空間,把賦予的值放在空間內
5.3 賦值時使用引號
- 雙引號:允許通過$符號引用其他變量值,即在可以代表字符串的情況下,若是有$存在也可以代表標量
- 單引號:禁止引用其他變量值,$是爲普通字符,即視爲字符串,不識別變量符號
- 反撇號:命令替換,提取命令執行後的輸出結果
- 變量=反撇號 相當於變量=$()
[root@localhost ~]# ps aux |wc -l
204
[root@localhost ~]# num=`ps aux | wc -l`
[root@localhost ~]# echo $num
203
[root@localhost ~]# abc=$(ps aux | wc -l)
[root@localhost ~]# echo $abc
203
請輸入你想管理的服務 如何管理你的服務(選項:start,status,stop)
5.4 從鍵盤輸入內容爲變量賦值 read
- read [-p 提示信息] 變量名
[root@localhost ~]# vim demo.txt
#!/bin/bash
#this is test
read -p "請輸入一個整數:" score
echo "你的成績爲$score"
[root@localhost ~]# sh demo.txt
請輸入一個整數:996
你的成績爲996
~
從控制檯的輸入和輸出
java的操作
5.5 設置變量的作用範圍 export 設置全局可用
- 格式1:export 變量名
- 格式2:export 變量名=變量值
- 兩種格式可以混合使用
export可以把變量定義爲全局變量,這樣的話,不管是切換bash環境,還是切換用戶都可以使用該變量
[root@localhost ~]# echo $abc
203
[root@localhost ~]# bash
[root@localhost ~]# echo $abc
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $abc
203
[root@localhost ~]# export $abc '只識別變量名'
bash: export: `203': 不是有效的標識符
[root@localhost ~]# export abc
[root@localhost ~]# bash
[root@localhost ~]# echo $abc
203
[root@localhost ~]# exit
exit
[root@localhost ~]#
5.6 整數變量的運算 expr
- expr 變量1 運算符 變量2 [運算符 變量3].。。。。。
- 常用運算符
- 加法運算:+
- 減法運算:-
- 乘法運算:* 乘法必須要加\,因爲在shell語言中,*代表通配符號
- 除法運算:/
- 求模(取餘)運算:%
[root@localhost ~]# expr 3 + 2
5
[root@localhost ~]# expr 9 - 10
-1
[root@localhost ~]# expr 9 / 10
0
[root@localhost ~]# expr 10 / 9
1
[root@localhost ~]# expr 10 / 8
1
[root@localhost ~]# expr 6 / 3
2
[root@localhost ~]# expr 3 \* 2
6
[root@localhost ~]# expr 3 * 2
expr: 語法錯誤
[root@localhost ~]# expr 39 % 5
4
[root@localhost ~]# echo $(expr 3 + 3)
6
[root@localhost ~]# sum='expr 3 + 3' '單引號'
[root@localhost ~]# echo $sum
expr 3 + 3
[root@localhost ~]# sum=`expr 3 + 3` '反撇號'
[root@localhost ~]# echo $sum
6
六 : 特殊的shell變量
6.1 環境變量
- 由系統提前創建,用來設置用戶的工作環境
- 配置文件: /etc/profile、~/.bash_prolile
6.2 常見的環境變量
- PWD\、PATH
- USER、SHELL、HOME
[root@localhost ~]# vim /etc/profile
MAIL="/var/spool/mail/$USER"
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
[root@localhost ~]# echo $MAIL
/var/spool/mail/root
[root@localhost ~]# echo $HOSTNAME
localhost.localdomain
[root@localhost ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
[root@localhost ~]# PATH="$PATH:/root"
[root@localhost ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:/root
:加環境變量
6.3 位置變量
-
表示爲$n,n爲1~9之間的數字
-
[root@localhost ~]# ./myprog.sh 'one' two three four five 'six' '$1,第一個位置參數' '$6,第六位置參數'
[root@localhost ~]# vim demo.sh
sum=0
sum=`expr $1 + $2`
echo "總和爲$sum"
echo "執行的腳本是$0"
echo "參數的個數是$#"
echo "詳細內容是$*"
cho "執行成功$?"
[root@localhost ~]# sh demo.sh 70 80
總和爲150
執行的腳本是demo.sh
參數的個數是2
詳細內容是70 80
執行成功0
統計是$#,
除此之外還有$? 是否執行成功,成功是0,不成功是非0值
詳細內容是$*
6.4 預定義變量
- $#:命令行中位置變量的個數
- $*:所有位置變量的內容
- $?:上一條命令執行後返回的狀態,當返回狀態值爲0時表示執行正常,非0值表示執行異常或出錯
- $0:當前執行的進程/程序名
/dev/null 類似一個擁有無限容量的目錄,所有不用的文件都可以放到裏面,一旦放進去,無法找回,慎用
跟/dev/null類似的還有/dev/zero,一個擁有無限大的文件,兩個都做測試使用
總結
- 重定向與管道操作
- 自定義變量的定義、查看、引用、賦值、作用範圍
- 數值變量的運算
- 環境變量、位置變量、預定義變量的作用與用途
實驗
實驗環境
- 爲了集中查看linux服務器各方面的運行情況,管理員(root)希望定製自己的登陸環境,以便自動顯示監控信息。另外,通過編寫簡單的shell腳本,熟悉Linux自動化管理的基本途徑
需求描述
- 編寫登陸歡迎腳本welcome.sh
- 編寫服務控制腳本實現start、stop、status 功能
#!/bin/bash
username=`whoami`
percent=20
echo "====歡迎你, $username===="
echo "以下分區使用率超過$percent%"
df -Th | awk -v percent=$percent 'BEGIN {NR!=1} {if ($6 > percent){print $7"\t"$6} }'
[root@localhost bash]# echo "/root/bash/welcome.sh" >> /root/.bashrc
[root@localhost bash]# su - root
Last login: Mon Nov 25 18:44:16 GMT 2019 on pts/2
====歡迎你, root====
以下分區使用率超過20%
Mounted Use%
/ 25%
/boot 33%
然後把這個腳本的絕對路徑寫入到~/.bashrc中即可
#!/bin/bash
#this is zuoye
systemctl stop firewall.sevrice
setenforce 0
read -p "請輸入你想管理的服務:" score
read -p "如何管理你的服務(選項:start,status,stop)" scorea
systemctl $scorea $score
echo "systemctl $scorea $score"