shell編程
shell基礎介紹
shell編程的意義
為什么使用shell編程
節約時間
顯示腳本執行程序
前面有+表示執行過的命令的
前面沒有東西,表示輸出到螢屏上的內容,
[root@nfsnobody scripts]# sh bak-etc-adv.sh
tar: Removing leading `/' from member names
[root@nfsnobody scripts]# sh -x bak-etc-adv.sh
++ hostname -I
++ awk '{print $1}'
+ ip=10.0.0.200
+ mkdir -p /backup/10.0.0.200
++ date +%F
+ tar zcf /backup/10.0.0.200/etc-2018-08-17.tar.gz /etc/
tar: Removing leading `/' from member names
變數
什么是變數
x + y = 10 x=20 y=? 未知數(變數)
變數命名規則
變數命名規則: 不能以數字開頭
ip=10.0.0.200
賦值(把資料存放在變數中)
[root@nfsnobody /server/scripts]# echo $ip 查看變數內容
10.0.0.200
[root@nfsnobody /server/scripts]# 1ip=10.0.0.200 無法設定變數
-bash: 1ip=10.0.0.200: command not found
變數分類
普通變數(區域變數)
環境變數(全域變數)
特殊變數:(重點)
普通變數(區域變數)
用=可以配置區域變數
如ip=10.0.0.200
[root@nfsnobody /server/scripts]# ip=10.0.0.200 設定普通變數
[root@nfsnobody /server/scripts]# echo $ip 查看變數內容
10.0.0.200
環境變數(全域變數)
大寫的
系統定義的
在大部分地方可以使用
env命令可以查看所有的環境變數
export 設定環境變數
unset 取消環境變數
目前已經學習過的有PATH PS1 LANG
取env的第一列內容(回顧)
env可以查看所有的環境變數
[root@CentOS scripts]# env
[root@CentOS scripts]# env |awk -F "=" '{print $1}'
[root@CentOS scripts]# env |sed -r 's#=.*##g'
[root@CentOS scripts]# env | egrep -o '^[A-Z0-9_]+'
[root@CentOS scripts]# env | egrep -o '^[^=]+'
普通變數與全域變數的區別
[root@nfsnobody /server/scripts]# nfsnobody=10 配置一個普通變數
[root@nfsnobody /server/scripts]# echo $nfsnobody 查看變數
10
[root@nfsnobody /server/scripts]# cat show.sh 腳本的內容
echo $nfsnobody
[root@nfsnobody /server/scripts]# sh show.sh 執行 沒有變數的內容
[root@nfsnobody /server/scripts]# sh -x show.sh 顯示執行程序 沒有
+ echo
[root@nfsnobody /server/scripts]# export nfsnobody=10 配置成全域變數(環境變數)
[root@nfsnobody /server/scripts]# sh -x show.sh 有結果了
+ echo 10
10
[root@nfsnobody /server/scripts]# env |grep -i nfsnobody 配置成全域變數 在env也可以查到
HOSTNAME=nfsnobody
nfsnobody=10

[root@CentOS scripts]# cat show.sh 查看腳本內容
#!/bin/bash
echo $nfsnobody
[root@CentOS scripts]# nfsnobody=10 配置nfsnobody的變數 普通變數
[root@CentOS scripts]# env |grep old 檢查env是否有nfsnobody的全域變數 檢查沒有發現
[root@CentOS scripts]# source show.sh 使用source 可以使區域變數在腳本內生效
10
[root@CentOS scripts]# . show.sh 區域變數生
10
[root@CentOS scripts]# sh show.sh 使用sh區域變數沒有生效
特殊變數(重點)
特殊變數介紹
$1 $2 表示 第一個 第二個引數
$# 表示引數的個數
$? 表示上一個命令執行后的狀態
狀態為0 表示執行正確
狀態非0 表示執行錯誤
$0 表示檔案名
特殊變數小結:
$1 $2 $數字 awk:第1列 第2列 第3列
shell腳本:第1個引數
$0 awk:整行
shell腳本:檔案名
$# 腳本的引數個數
判斷腳本的引數個數
$? 上一個命令的執行結果(回傳值)
0 執行正確
非0 執行失敗
特殊變數測驗
{}的用處
[root@nfsnobody /server/scripts]# week=6 配置一個變數
[root@nfsnobody /server/scripts]# echo $week 查看
6
想要在變數后面加上天數顯示6day
[root@nfsnobody /server/scripts]# echo $weekday
[root@nfsnobody /server/scripts]# echo ${week}day
6day
$1 $2
第1個引數 第2個引數
[root@nfsnobody /server/scripts]# cat cal.sh 查看腳本內容
#!/bin/bash
n1=$1
n2=$2
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1-num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1*num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1/num2 }'
[root@nfsnobody /server/scripts]# sh cal.sh 10 20
執行腳本 10表示第一個變數$1 20表示的是$2
30
-10
200
0.5
$0的使用
$0 shell腳本中表示檔案名
[root@CentOS scripts]# cat cal-read.sh
#!/bin/bash
echo "當前編輯的檔案為: $0"
[root@CentOS scripts]# sh cal-read.sh
當前編輯的檔案為: cal-read.sh
$? 的使用
$? 表示上一個命令執行后的狀態
狀態為0 表示執行正確
狀態非0 表示執行錯誤
[root@nfsnobody ~]# aaa 執行一個字符
-bash: aaa: command not found 執行失敗
[root@nfsnobody ~]# echo $? 查看$?
127 非0 表示上一個命令執行錯誤執行錯誤
[root@nfsnobody ~]# sh /server/scripts/show2.sh aa bb
aa bb 2
[root@nfsnobody ~]# echo $? 0表示上一個命令執行成功
0
$#的使用
$# 表示引數的個數
腳本內容
[root@nfsnobody ~]# cat /server/scripts/show2.sh
#!/bin/bash
echo 112 $#
if [ $? == 0 ];then
echo "OK"
fi
執行的不同結果
[root@nfsnobody ~]# sh /server/scripts/show2.sh 1 2 3 4 6 5個引數 $# 顯示引數的個數
1 2 5 表示一個五個引數
[root@nfsnobody ~]# sh /server/scripts/show2.sh aa bb 2個引數 $# 顯示引數的個數
aa bb 2 兩個引數
[root@nfsnobody ~]# sh /server/scripts/show2.sh aa bb cc 3個引數 $# 顯示引數的個數
aa bb 3 三個引數
awk的變數
命令列中的變數 放在awk中 無法直接使用 需要用awk的方式重新定義變數
用-v重新定義變數 如-vnum1=10
書寫一個計算器 加減乘除
變數中 把兩個數字放在變數中
[root@nfsnobody /server/scripts]# n1=10 在命令列定義變數n1
[root@nfsnobody /server/scripts]# n2=20 在命令列定義變數n2
[root@nfsnobody /server/scripts]# awk 'BEGIN{print n1/n2}' 使用awk計算
awk: fatal: division by zero attempted 報錯無法執行
[root@nfsnobody /server/scripts]# awk 'BEGIN{print n1,n2}'
顯示也無法顯示 變數不可用
[root@nfsnobody /server/scripts]# awk -vnum1=10 'BEGIN{print num1 }'
10
[root@nfsnobody /server/scripts]# awk -vnum1=10 -vnum2=20 'BEGIN{print num1/num2 }'
0.5
書寫腳本計算10與20的加減乘除
cal.sh
#!/bin/bash
n1=10
n2=30
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1-num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1*num2 }'
awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1/num2 }'
awk -v {num1=$n1,num2=$n2} 'BEGIN{print num1/num2 }' 也可以這種寫法
vim快捷鍵
批量洗掉
批量增加
1.進入批量編輯模式(可視塊)
2.選擇 批量增加的范圍
3.按 shift + i 進行修改
4.按esc 退出等等
ctrl + v 按d批量洗掉
ctrl + v 按x批量洗掉
dd 洗掉游標所在行
dG 洗掉游標所在行到最后一行
D 游標所在位置到行尾的內容
x 洗掉游標所在位置的一個字符
read命令
通過read 互動式
read互動式賦予變數內容
read -p "提示資訊:" 變數名字
read -p "提示資訊:" p
執行之后會把輸入的資訊存放在變數中
-p 為顯示提示資訊,p作為輸出,一定要寫在其他引數的最后面,
-t5 等待5秒
-s 輸入的時候不顯示輸入內容,
[root@nfsnobody ~]# read a 定義變數
呵呵 此處是輸入的內容
[root@nfsnobody ~]# echo $a 查看變數
呵呵
讓執行命令后出現提示資訊
-p 為顯示提示資訊,p作為輸出,一定要寫在其他引數的最后面,
[root@nfsnobody ~]# read -p "請輸入:" a
請輸入:呵呵
[root@nfsnobody ~]# echo $a
呵呵
設定等待(超時)的時間
-t5 等待5秒
[root@nfsnobody ~]# read -t5 -p "請輸入密碼:" a
請輸入密碼:
[root@nfsnobody ~]#
[root@nfsnobody ~]# read -t5 -p "請輸入密碼:" a
請輸入密碼:123
不顯示輸入的內容
-s 輸入的時候不顯示輸入內容,
[root@nfsnobody ~]# read -s -t50 -p "請輸入密碼:" a
請輸入密碼:
[root@nfsnobody ~]# echo $a
admin
將read命令運用到腳本上
修改計算器腳本的內容,讓他能夠更智能,
[root@nfsnobody ~]# vim /server/scripts/cal.sh
#!/bin/bash
read -p "input 1st num:" a 寫入read命令的內容
read -p "input 2st num:" b
測驗腳本
[root@nfsnobody ~]# sh /server/scripts/cal.sh
input 1st num:1 輸入1
input 2st num:2 輸入2
0.5
3
-1
2
read同時讀入多個字符
[root@nfsnobody ~]# read -p "輸入第一個 第二關數字:" a b
輸入第一個 第二關數字:123 456
[root@nfsnobody ~]# echo aab
123 456
修改腳本的內容,
使用一條read命令,讀取兩個引數,
[root@nfsnobody ~]# vim /server/scripts/cal.sh
#!/bin/bash
read -p "input 1st&2st num:" a b
awk -vnum1=a?vnum2=a?vnum2=b 'BEGIN{print num1/num2}'
awk -vnum1=a?vnum2=a?vnum2=b 'BEGIN{print num1+num2}'
awk -vnum1=a?vnum2=a?vnum2=b 'BEGIN{print num1-num2}'
awk -vnum1=a?vnum2=a?vnum2=b 'BEGIN{print num1*num2}'
"/server/scripts/cal.sh" 15L, 355C written
測驗腳本,
同時傳入兩個引數的時候,引數之間要使用空格分割.
[root@nfsnobody ~]# sh /server/scripts/cal.sh
input 1st&2st num:1 2
0.5
3
-1
2
判斷
判斷一個 檔案/目錄 是否存在
| 符號 | 引數 | 含義 | 英文 |
|---|---|---|---|
| > | -gt | 大于 | great than |
| >= | -ge | 大于等于 | great equal |
| < | -lt | 小于 | less than |
| <= | -le | 小于等于 | less than or equal |
| == | -eq | 等于 | equal |
| != | -ne / ! -eq | 不等于 | not equal |
test命令
test命令不會自己輸出執行的結果
配合$?查詢上一條命令是否執行成功,就能夠判斷是否存在這個檔案或目錄.
判斷檔案是否存在
-f 為判斷的物件是檔案,0為存在,1為不存在
[root@nfsnobody ~]# test -f /nfsnobody/nfsnobody.txt 使用test -f命令 查看檔案是否存在
[root@nfsnobody ~]# echo $? 查看變數
0 存在
[root@nfsnobody ~]# test -f /nfsnobody/nfsnobody 查看檔案是否存在
[root@nfsnobody ~]# echo $? 查看變數
1 不存在
判斷目錄是否存在
-d 為對目錄進行判斷,0為存在,1為不存在.
[root@nfsnobody ~]# test -d /nfsnobody 使用test -d命令 查看目錄是否存在
[root@nfsnobody ~]# echo $? 查看變數
1 不存在
[root@nfsnobody ~]# test `-d /nfsnobody/ 使用test -d命令 查看目錄是否存在
[root@nfsnobody ~]# echo $? 查看變數
0 存在
使用[ ]判斷
使用[ ]的時候注意中間的空格,兩邊都要有兩個空格
[ ]與test命令的功能相似,可以進行判斷,相比test命令更為便捷
判斷檔案是否存在
與test命令一樣 [ ] 判斷的結果也0為存在,1為不存在
-f 為判斷的物件是檔案
[root@nfsnobody ~]# [ -f /zinx.txt ] 查看nfsnobody.txt檔案是否存在
[root@nfsnobody ~]# echo $? 查看上一條命令的執行結果
1 不存在
[root@nfsnobody ~]# [ -f /root/nfsnobody.txt ] 查看/root/nfsnobody.txt檔案是否存在
[root@nfsnobody ~]# echo $? 查看上一條命令的執行結果
0 存在
判斷檔案/目錄是否存在,判斷成功執行后面的內容,輸出ok ;判斷失敗,不執行后面的命令.
[root@nfsnobody ~]# [ -f /nfsnobody/nfsnobody.txt ] && echo "ok"
##/nfsnobody/nfsnobody.txt該檔案不存在 所以沒有執行后面的命令 所以沒有結果
[root@nfsnobody ~]# [ -d /nfsnobody ] && echo "ok" 該目錄存在 所以執行了后面的命令 輸出OK
ok
如果這個檔案不存在,就創建 (使用 || ), || 前面命令執行錯誤,才執行后面的命令.
[root@nfsnobody ~]# [ -f /nfsnobody/nfsnobody.txt ] || touch /nfsnobody/nfsnobody.txt
前面檔案不存在 執行錯誤 執行了后面的 創建了/nfsnobody/nfsnobody.txt 檔案
[root@nfsnobody ~]# ls -l /nfsnobody/nfsnobody.txt
-rw-r--r-- 1 root root 0 Sep 20 10:31 /nfsnobody/nfsnobody.txt
如果/root/nfsnobodydir 目錄不存在就創建
[root@nfsnobody ~]# [ -d /root/nfsnobodydir ] || mkdir -p /root/nfsnobodydir
[root@nfsnobody ~]# ls -ld /root/nfsnobodydir
drwxr-xr-x 2 root root 4096 Sep 20 10:36 /root/nfsnobodydir
如果/root/nfsnobodydir 目錄不存在,就創建這個目錄
[root@nfsnobody ~]# [ ! -d /root/nfsnobodydir/1 ] && mkdir -p /root/nfsnobodydir/1
使用 && ,前面的執行成功,執行后面的; ! 表示非,不存在.
[root@nfsnobody ~]# ll -d /root/nfsnobodydir/1
drwxr-xr-x 2 root root 4096 Sep 20 10:41 /root/nfsnobodydir/1
判斷在腳本的使用
如果 [ 這個檔案存在 ];然后
提示檔案存在
否則
創建這個檔案
果如
判斷檔案是否存在,不存在就創建
寫入腳本的時候,注意腳本的基本格式.
[root@nfsnobody ~]# vim /server/scripts/if.sh
#!/bin/bash
if [ -f /root/nfsnobody.txt ];then
echo "檔案存在"
else
touch /root/nfsnobody.txt
fi
[root@nfsnobody ~]# sh /server/scripts/if.sh 測驗腳本
檔案存在
在腳本中進行判斷的格式
如果cal2.sh腳本的引數個數不等于2,就顯示 "命令錯誤"
書寫腳本
!= 表示判斷兩個是否不相等,如果不相等就顯示命令錯誤
#/bin/bash
if [ $# != 2 ];then
echo "命令錯誤"
fi
對腳本進行測驗.
[root@nfsnobody ~]# sh /server/scripts/cal2.sh
##當引數的個數為2的時候,不會輸出,個數不為二的時候輸出 命令錯誤
命令錯誤
[root@nfsnobody ~]# sh /server/scripts/cal2.sh 1 2
[root@nfsnobody ~]# sh /server/scripts/cal2.sh 1 2 3
命令錯誤
修改計算機的腳本
修改之前的計算器,進行兩個數字的加減乘除,在計算器前面加上引數個數判斷,當輸入的引數是2個的時候執行計算,不為2的時候顯示引數錯誤.
當輸入的引數不為2的時候 執行 echo "Usage: NUM1 NUM2", 然后執行 exit..
exit 表示前面的執行完成后就結束(跳出),不會再執行腳本后面的內容.
[root@nfsnobody ~]# vim /server/scripts/cal2.sh
#!/bin/bash
if [ $# -ne 2 ];then
echo "Usage: NUM1 NUM2"
exit
fi
a=$1
b=$2
awk -vh=a?vz=a?vz=b 'BEGIN{print h/z}'
awk -vh=a?vz=a?vz=b 'BEGIN{print h+z}'
awk -vh=a?vz=a?vz=b 'BEGIN{print h-z}'
awk -vh=a?vz=a?vz=b 'BEGIN{print h*z}'
測驗腳本
當輸入的引數個數不為2的時候執行echo 命令
當輸入的引數個數為2的時候進行計算
[root@nfsnobody ~]# sh /server/scripts/cal2.sh
Usage: NUM1 NUM2 ##提示資訊
[root@nfsnobody ~]# sh /server/scripts/cal2.sh 22 22
1
44
0
484
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/149753.html
標籤:Linux
上一篇:磁盤管理-下部
