前言
無論什么編程語言都離不開條件判斷(流控),SHELL也不例外,
例如,用戶輸入的密碼不夠長時提示用戶,你太短了
例如,用戶輸入了備份的目錄,如果有目錄繼續備份,如果沒有目錄創建目錄,
例如,用戶輸入成績,如果100-80分評為優秀,如果60-79分評為合格,如果59-0分評為不合格,
Shell 條件測驗
數值比較 [ 整數1 運算子 整數2 ]
運算子
[ 20 -gt 10 ] 大于
[ 1 -lt 10 ] 小于
[ 1 -eq 1 ] 等于
[ 1 -ne 10 ] 不等于
[ 20 -ge 10 ] 大于等于
[ 10 -le 10 ] 小于等于
示例
需求:
猜測用戶輸入的密碼,是否滿足長度需求
變數長度:echo ${#pass}
測驗語法:
格式1: test 條件運算式
格式2: [ 條件運算式 ]
格式3: [[ 條件運算式 ]]
if語法結構
read -p "請輸入您的密碼:" ps
if [ ${#ps} -lt 7 ];then
echo "您的密碼太短!"
else
echo "您的密碼真長!"
fi
測驗
[root@localhost ~]# bash pass1.sh
請輸入您的密碼:123
您的密碼太短!
[root@localhost ~]# bash pass1.sh
請輸入您的密碼:1234
您的密碼太短!
[root@localhost ~]# bash pass1.sh
請輸入您的密碼:123456
您的密碼太短!
[root@localhost ~]# bash pass1.sh
請輸入您的密碼:1234567
您的密碼真長!
檔案測驗 [ 運算子 檔案或目錄 ]
運算子(了解)
-f filename : 當filename 存在時回傳真
-b filename : 當filename 存在并且是塊檔案時回傳真(回傳0)
-d pathname : 當pathname 存在并且是一個目錄時回傳真
-h filename : 當filename 存在并且是符號鏈接檔案時回傳真 (或 -L filename)
-c filename : 當filename 存在并且是字符檔案時回傳真
-e pathname : 當由pathname 指定的檔案或目錄存在時回傳真
-g pathname : 當由pathname 指定的檔案或目錄存在并且設定了SGID 位時回傳真
-k pathname : 當由pathname 指定的檔案或目錄存在并且設定了"粘滯"位時回傳真
-p filename : 當filename 存在并且是命名管道時回傳真
-r pathname : 當由pathname 指定的檔案或目錄存在并且可讀時回傳真
-s filename : 當filename 存在并且檔案大小大于0 時回傳真
-S filename : 當filename 存在并且是socket 時回傳真
-t fd: 當fd 是與終端設備相關聯的檔案描述符時回傳真
-w pathname : 當由pathname 指定的檔案或目錄存在并且可寫時回傳真
-x pathname : 當由pathname 指定的檔案或目錄存在并且可執行時回傳真
-O pathname : 當由pathname 存在并且被當前行程的有效用戶id 的用戶擁有時回傳真(字母O 大寫)
-G pathname : 當由pathname 存在并且屬于當前行程的有效用戶id 的用戶的用戶組時回傳真
需求:
請用戶輸入備份的路徑,如果存在提示已存在可以備份,如果不存在提示目錄不存在請創建,
腳本
#!/bin/bash
read -p "請輸入您要備份的目錄:" cata
if [ -d $cata ];then
echo "$cata已存在可以備份"
else
echo "${cata}不存在無法創建"
fi
[root@bogon ~]# sh catalogue.sh
請輸入您要備份的目錄:ccc
ccc不存在無法創建
[root@bogon ~]# mkdir /soft
[root@bogon ~]# sh catalogue.sh
請輸入您要備份的目錄:/soft
/soft已存在可以備份
字串比較 [ "字串" = "字串" ]
=,等于
需求
邀請用戶確認,yes升級,否則不升級
腳本
#!/bin/bash
read -p "您確定要升級嗎:" tt
if [ ${tt} = "yes" ];then
echo "正在升級"
else
echo "您不升級"
fi
[root@bogon ~]# sh zifu.sh
您確定要升級嗎:yes
正在升級
[root@bogon ~]# sh zifu.sh
您確定要升級嗎:no
[root@bogon ~]# 您不升級
!=,不等于
注意嘆號和等號間沒有空格
腳本
#!/bin/bash
read -p "您確定要升級嗎:" tt
if [ ${tt} != "yes" ];then
echo "正在升級"
else
echo "您不升級"
fi
[root@bogon ~]# sh zifu.sh
您確定要升級嗎:yes
您不升級
[root@bogon ~]# sh zifu.sh
您確定要升級嗎:no
正在升級
發現正好和上面相反
-z:判斷字符長度是為0(了解)
-n: 判斷字符長度不是為0
雙引號的重要性,解決一元運算式的問題
雙引號的重要性,解決一元運算式的問題
[root@localhost ~]# BBB=""
[root@localhost ~]# echo ${#BBB}
0
[root@localhost ~]# [ -z "$BBB" ] 字符長度是為0
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -n "$BBB" ] 字符長度不為0
[root@localhost ~]# echo $?
1
and和or
簡介
當條件測驗比較復雜時,需要多個條件同時成立,就需要混合條件測驗了,
邏輯的(and)與(or):&& 邏輯的 AND 的意思, -a ,兩個條件同時成立,為真,
|| 邏輯的 OR 的意思, -o ,兩個條件一個成立,為真,
事例
猜測用戶輸入的密碼是否滿足如下條件
1.長度大于等于7位
2.包含字母大寫
3.包含字母小寫
4.包含符號“@!_”
腳本
read -p "請輸入您的密碼:" password
if [ ${#password} -gt 7 ] && [[ ${password} =~ [a-z] ]] && [[ ${password} =~ [A-Z] ]] && [[ ${password} =~ [@_!] ]];then
echo "您的密碼真的復雜"
else
echo “您的密碼太簡單了”
fi
[root@bogon ~]# sh andor.sh
請輸入您的密碼:12345aZ!
您的密碼真的復雜
[root@bogon ~]# sh andor.sh
請輸入您的密碼:123245
“您的密碼太簡單了”
多種表達方法(了解)
[root@localhost ~]# [ 1 -lt 2 -a 5 -gt 10 ]
[root@localhost ~]# [ 1 -lt 2 -o 5 -gt 10 ]
[root@localhost ~]# [[ 1 -lt 2 && 5 -gt 10 ]]
[root@localhost ~]# [[ 1 -lt 2 || 5 -gt 10 ]]
[root@localhost ~]# [ 1 -lt 2 ] && [ 11 -gt 10 ]
流程控制 if
單分支結構
語法
if [ command/test ];then
符合該條件執行的陳述句
fi
需求
撰寫腳本,由用戶輸入用戶名,如果用戶不存在,則創建該用戶
了解一下$?變數
上個命令的退出狀態,或函式的回傳值
#!/bin/bash
read -p "請輸入要創建的用戶名稱:" name
id $name &> /dev/null
if [ $? -ne 0 ];then
useradd $name
fi
[root@bogon ~]# sh create
請輸入要創建的用戶名稱:cccc
[root@bogon ~]# id cccc
uid=1025(cccc) gid=1025(cccc) 組=1025(cccc)
雙分支結構
語法
if 條件測驗
then
命令序列
else
命令序列
fi
需求
撰寫腳本,由用戶輸入用戶名,如果用戶不存在,則創建該用戶,并設定密碼為123456;否則,提示用戶已經存在
腳本
#!/bin/bash
read -p "請輸入要創建的用戶名稱:" name
if id $name &> /dev/null; then
echo "${name}用戶已經存在"
else
useradd ${name}
echo "123456" | passwd --stdin $name &> /dev/null
echo "$name用戶創建成功密碼是123456"
fi
[root@bogon ~]# sh user.sh
請輸入要創建的用戶名稱:rrr
rrr用戶創建成功密碼是123456
[root@bogon ~]# sh user.sh
請輸入要創建的用戶名稱:rrr
rrr用戶已經存在
多分支結構
語法
多分支結構
if 條件測驗1
then 命令序列
elif 條件測驗2
then 命令序列
elif 條件測驗3
then 命令序列...
else 命令序列
fi
需求
撰寫腳本,取出系統時間的小時,對數字進行判斷
6--10 this is morning
11-13 this is noon
14-18 this is afternoon
其他 this is night
腳本
#!/bin/bash
hour=`date +%H`
if [ $hour -ge 6 -a $hour -le 10 ];then
echo "this is morning"
elif [ $hour -ge 11 -a $hour -le 13 ];then
echo "this is noon"
elif [ $hour -ge 14 -a $hour -le 18 ];then
echo "this is afternoon"
else
echo "this is night"
fi
[root@bogon ~]# sh date.sh
this is afternoon
[root@bogon ~]# date
2022年 08月 24日 星期三 16:59:30 CST
[root@bogon ~]# date -s 10:10:06
2022年 08月 24日 星期三 10:10:06 CST
[root@bogon ~]# sh date.sh
this is morning
嵌套結構(了解)
語法
嵌套結構
if 條件測驗1 then 命令序列
if 條件測驗1 then 命令序列
else 命令序列
fi
else 命令序列
fi
需求

如圖所示:創建用戶,如果不存在則創建用戶提示用戶輸入密碼,密碼大于7位則創用戶,密碼小于七位提示密碼不符合要求,如果用戶已經存在,提示存在即可!
腳本
#!/bin/bash
read -p "請輸入要創建用戶名稱:" name
id ${name} &> /dev/null
if [ $? -eq 0 ];then
echo "${name}已存在"
else
useradd ${name}
echo "$name創建完成:"
read -p "請輸入用戶密碼" password
if [ ${password} -ge 7 ];then
echo ${password} | passwd --stdin $name
echo "$name用戶密碼是${password}"
else
echo "密碼不符合要求"
fi
fi
[root@bogon ~]# sh name.sh
請輸入要創建用戶名稱:kkk
kkk創建完成:
請輸入用戶密碼123456
更改用戶 kkk 的密碼 ,
passwd:所有的身份驗證令牌已經成功更新,
kkk用戶密碼是123456
[root@bogon ~]# sh name.sh
請輸入要創建用戶名稱:kkk
kkk已存在
除錯腳本
除錯腳本的其他方法:
# sh -n 02.sh 僅除錯腳本中的語法錯誤,
# sh -vx 02.sh 以除錯的方式執行,查詢整個執行程序
注意
1、[ ]表示條件測驗,注意這里的空格很重要,要注意在'['后面和前面']都必須要有空格
2、在shell中,then和fi是分開的陳述句,如果要在同一行里面輸入,則需要用分號將他們隔開,
3、注意if判斷中對于變數的處理,需要加引號,以免一些不必要的錯誤,沒有加雙引號會在一些含空格等的字串變數判斷的時候產生錯誤,比如[ -n "$var" ]如果var為慷訓出錯
4、判斷是不支持浮點值的
5、如果只單獨使用>或者<號,系統會認為是輸出或者輸入重定向,雖然結果顯示正確,但是其實是錯誤的,因此要對這些符號進行轉意
6、默認,運行if陳述句中的命令,所產生的錯誤資訊,仍然出現在腳本的輸出結果中
7、使用-z或者-n來檢查長度的時候,沒有定義的變數也為0
8、空變數和沒有初始化的變數可能會對shell腳本測驗產生災難性的影響,因此在不確定變數的內容的時候,在測驗號前使用-n或者-z測驗一下
9、$? 變數包含了之前執行命令的退出狀態(最近完成的前臺行程)(可以用于檢測退出狀態)
模式匹配:case
前言
shell編程中if和case都是用來做流控的,
下面先通過一個案例1,來了解case的特點,
案例1:簡單的模式匹配
需求
邀請用戶輸入待洗掉用戶名,詢問用戶,確定要繼續洗掉嗎 yes/no: " y
if寫法
#!/bin/bash
#name
#time
#1請輸入洗掉的用戶名:
read -p "please input a username : " user
#2請用戶確認是否洗掉
read -p "are you sure?[y/n]: " action
if [ "$action" = "y" -o "$action" = "Y" ] ;then
userdel -r $user
echo "$user is deleted!"
else
echo "thank you"
fi
case 語法結構
case 變數 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
*)
無匹配后命令序列
case寫法
#!/bin/bash
#name
#time
#1請輸入洗掉的用戶名:
read -p "please input a username : " user
#2請用戶確認是否洗掉
read -p "確認洗掉嗎?[yes/no] " action
#3 case 流控寫法
case "$action" in
Y|y|YES|yes|Yes|YeS|YEs)
userdel -r $user
echo "$user is deleted!"
;;
*)
echo "thank you"
;;
esac
案例2:簡單的JumpServer
需求
由于作業中,我們需要管理N多臺服務器,那么訪問服務器就是一件繁瑣的事情,通過shell編程,撰寫跳板程式,當我們需要訪問服務器時,看一眼服務器串列名,按一下數字,就登錄成功了,
跳板主機,運行跳板腳本,彈出數十臺服務器名的選單
1)mysql1
2)mysql2
3)bj-web1
........
h) help
q) exit
用戶請選擇要連接的主機[1-3]: 1
Last login: Sun Sep 6 04:18:01 2015 from 192.168.122.1
[root@localhost ~]$連接成功!!!
演示
#!/usr/bin/bash
#定義目標主機IP
web1=192.168.51.152
web2=192.168.51.128
mysql1=192.168.51.88
#列印跳轉選單
cat <<EOF
1.WEB1
2.WEB2
3.MYSQL1
EOF
#讀取用戶輸入
read -p "input number: " num
#判斷用戶選擇
case $num in
1)
ssh alice@$web1
;;
2)
ssh alice@$web2
;;
*)
echo '123'
esac
案例3:系統管理工具箱
前言
linux提供的豐富的管理命令,用戶管理,記憶體管理,磁盤管理,行程管理,日志管理,檔案管理,軟體管理,網路管理等等數十個工具包,
如果你能通過shell編程,把他們撰寫到一個程式里,想用某些功能,只需要按回車,就能完成,
事例
Command action
h 顯示命令幫助
f 顯示磁盤磁區
d 顯示磁盤掛載
m 查看記憶體使用
u 查看系統負載
q 退出程式
Command (h for help): m
total used free shared buffers cached
Mem: 7628 840 6788 0 29 378
Swap: 2047 0 2047
演示
定義腳本
1 輸出選單并測驗,
vim systemmanage.sh
#!/usr/bin/bash
#列印選單
cat <<-EOF
h. help
f. disk partation
d. filesystem mount
m. memory
u. system load
q.exit
EOF
# 讀取用戶輸入,進行模式匹配
read -p "please input [h for help]: " action
case "$action" in
f)
fdisk -l
;;
d)
df -hT
;;
m)
free -m
;;
u)
uptime
;;
q)
exit
;;
"")
;;
*)
echo "error"
;;
esac
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/502622.html
標籤:其他
上一篇:一、物件與類
