文章目錄
- 1. read 交互式初始化變量
- 1.1 案例-安裝不同的軟件
- 1.2 案例-比較大小
- 2. 計算
- 2.1 bc
- 2.2 awk
- 2.3 expr
- 2.4 let
- 2.5 案例-計算內存的空閑率
- 2.6 案例-檢查域名過期時間和https證書過期時間
- 3. 循環
- 3.1 循環控制語句
- 3.2 for循環-c語言格式
- 3.3 while循環
- 3.3.1 案例-猜數字
- 3.3.2 讀取文件
- 3.3.3 案例-讀取文件,批量ping和wget
- 4. 踩坑記錄
- 1. -bash: 條件表達式中有語法錯誤
- 5. 思維導圖
1. read 交互式初始化變量
- read是從標準輸入獲取數據,一般用來在腳本中交互式為變量賦值
- -p “信息”:打印提示信息
- -t:設置輸入時間
- -s:靜默模式,不顯示輸入的數據,類似于輸入密碼
1.1 案例-安裝不同的軟件
[root@oldboy99-Kylin /server/scripts]# cat read_install_pkg.sh
#!/bin/bash
##############################################################
# File Name: read_install_pkg.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################export LANG=en_US.UTF-8
cat <<EOF
請選擇:
1.安裝nginx
2.安裝php
3.安裝mysql
4.安裝DeepSeek
5.安裝tomcat
6.安裝所有
7.退出
EOF
# read
read -p "請輸入您的選擇:" choose# vars# command
case $choose in1)echo install nginx ;;2)echo install php ;;3)echo install mysql ;;4)echo install DeepSeek ;;5)echo install tomcat ;;6)echo install all ;;7) exit ;;*)echo "Usage:$0 數字"exit 1
esac[root@oldboy99-Kylin /server/scripts]# bash read_install_pkg.sh
請選擇:
1.安裝nginx
2.安裝php
3.安裝mysql
4.安裝DeepSeek
5.安裝tomcat
6.安裝所有
7.退出
請輸入您的選擇:100
Usage:read_install_pkg.sh 數字
[root@oldboy99-Kylin /server/scripts]# bash read_install_pkg.sh
請選擇:
1.安裝nginx
2.安裝php
3.安裝mysql
4.安裝DeepSeek
5.安裝tomcat
6.安裝所有
7.退出
請輸入您的選擇:1
install nginx
[root@oldboy99-Kylin /server/scripts]# bash read_install_pkg.sh
請選擇:
1.安裝nginx
2.安裝php
3.安裝mysql
4.安裝DeepSeek
5.安裝tomcat
6.安裝所有
7.退出
請輸入您的選擇:6
install all
[root@oldboy99-Kylin /server/scripts]# bash read_install_pkg.sh
請選擇:
1.安裝nginx
2.安裝php
3.安裝mysql
4.安裝DeepSeek
5.安裝tomcat
6.安裝所有
7.退出
請輸入您的選擇:7
1.2 案例-比較大小
[root@oldboy99-Kylin /server/scripts]# cat compare_2.sh
#!/bin/bash
##############################################################
# File Name: compare_2.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:比較大小,交互傳參
##############################################################
export LANG=en_US.UTF-8# vars
read -p "請輸入參數1、參數2:" num1 num2# command
# 判斷是否是數字
if [[ ! "$num1" =~ ^-?[0-9]+$ || ! "$num2" =~ ^-?[0-9]+$ ]];thenecho "$num1或者${num2}不是數字"exit 1
fi
#[[ "$num2" =~ ^-?[0-9]+$ ]] || {
# echo "$num2 不是數字"
# exit 1
#}
# 比較
if [ $num1 -gt $num2 ];thenecho "$num1 > $num2"
elif [ $num1 -eq $num2 ];thenecho "$num1 = $num2"
elseecho "$num2 > $num1"
fi[root@oldboy99-Kylin /server/scripts]# bash compare_2.sh
請輸入參數1、參數2:-3 a
-3或者a不是數字
[root@oldboy99-Kylin /server/scripts]# bash compare_2.sh
請輸入參數1、參數2:-1 -3
-1 > -3
[root@oldboy99-Kylin /server/scripts]# bash compare_2.sh
請輸入參數1、參數2:30 23
30 > 23
[root@oldboy99-Kylin /server/scripts]# bash compare_2.sh
請輸入參數1、參數2:10 20
20 > 10
2. 計算
計算方案 | 說明 | 應用場景 |
---|---|---|
awk/bc | 整數、小數都可以計算 | 計算小數、整數,或比較大小 |
expr | 計算整數 | 檢查輸入的內容是否為數字(也可以用[[ =~ ]]) |
let/$(())/$[] | 計算整數 | 配合循環使用 |
2.1 bc
bc:Basic calculation,基礎計算
- -l(小寫的L):使用標準數學庫,顯示精準小數
- 直接使用是交互式的計算器
- 非交互式一般和echo配合使用
# 計算器
[root@oldboy99-Kylin /server/scripts]# bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
22-10
12
10^3
1000
……
[root@oldboy99-Kylin /server/scripts]# echo "10+20" |bc
30
[root@oldboy99-Kylin /server/scripts]# echo "10-20" |bc
-10
[root@oldboy99-Kylin /server/scripts]# echo "10*20" |bc
200
[root@oldboy99-Kylin /server/scripts]# echo "10/20" |bc
0
[root@oldboy99-Kylin /server/scripts]# echo "10/20" |bc -l
.50000000000000000000
[root@oldboy99-Kylin /server/scripts]# echo "10^2" |bc
100
[root@oldboy99-Kylin /server/scripts]# echo "10%2" |bc
0
2.2 awk
-v <變量名>=<值>
: 設置awk
內部的變量值。可以使用該選項將外部值傳遞給awk
腳本中的變量。- BEGIN關鍵詞:BEGIN{},里面存放awk執行前的語句
[root@oldboy99-Kylin /server/scripts]# awk -v n1=10 'BEGIN{print n1}'
10
[root@oldboy99-Kylin /server/scripts]# awk -v n1=10 'BEGIN{print n1}'
10
[root@oldboy99-Kylin /server/scripts]# awk -v n1=10 -v n2=20 'BEGIN{print n1+n2}'
30
[root@oldboy99-Kylin /server/scripts]# awk -v n1=10 -v n2=20 'BEGIN{print n1-n2}'
-10
[root@oldboy99-Kylin /server/scripts]# awk -v n1=10 -v n2=20 'BEGIN{print n1*n2}'
200
[root@oldboy99-Kylin /server/scripts]# awk -v n1=10 -v n2=20 'BEGIN{print n1/n2}'
0.5
[root@oldboy99-Kylin /server/scripts]# awk -v n1=10 -v n2=20 'BEGIN{print n1^n2}'
100000000000000000000
[root@oldboy99-Kylin /server/scripts]# awk -v n1=10 -v n2=20 'BEGIN{print n1%n2}'
10
[root@oldboy99-Kylin /server/scripts]# awk -v n1=10 -v n2=20 'BEGIN{print n2%n1}'
0
# 集合變量計算
[root@oldboy99-Kylin /server/scripts]# num1=10
[root@oldboy99-Kylin /server/scripts]# num2=20
[root@oldboy99-Kylin /server/scripts]# awk -v n1=$num1 -v n2=$num2 'BEGIN{print n1}'
10
[root@oldboy99-Kylin /server/scripts]# awk -v n1=$num1 -v n2=$num2 'BEGIN{print n1+n2}'
30
[root@oldboy99-Kylin /server/scripts]# awk -v n1=$num1 -v n2=$num2 'BEGIN{print n1-n2}'
-10
[root@oldboy99-Kylin /server/scripts]# awk -v n1=$num1 -v n2=$num2 'BEGIN{print n1*n2}'
200
[root@oldboy99-Kylin /server/scripts]# awk -v n1=$num1 -v n2=$num2 'BEGIN{print n1/n2}'
0.5
[root@oldboy99-Kylin /server/scripts]# awk -v n1=$num1 -v n2=$num2 'BEGIN{print n2^n1}'
10240000000000
[root@oldboy99-Kylin /server/scripts]# awk -v n1=$num1 -v n2=$num2 'BEGIN{print n2%n1}'
0
[root@oldboy99-Kylin /server/scripts]# awk -v n1=$num1 -v n2=$num2 'BEGIN{print n1%n2}'
10
2.3 expr
expr:evaluate expressions,計算表達式
- 一般用來驗證變量是否是數字
- 也能計算字符串長度
# 數字與算數字符之間要有空格
[root@oldboy99-Kylin /server/scripts]# expr 10 + 20
30
[root@oldboy99-Kylin /server/scripts]# expr 10 - 20
-10
[root@oldboy99-Kylin /server/scripts]# expr 10 * 20
expr: 語法錯誤:未預期的參數 “api.txt”
# 要用轉義字符
[root@oldboy99-Kylin /server/scripts]# expr 10 \* 20
200
# expr只能計算整數,結果也只能是整數
[root@oldboy99-Kylin /server/scripts]# expr 10 / 20
0
# 判斷變量是否是數字
[root@oldboy99-Kylin /server/scripts]# num=10
[root@oldboy99-Kylin /server/scripts]# expr $num + 1
11
[root@oldboy99-Kylin /server/scripts]# echo $?
0
[root@oldboy99-Kylin /server/scripts]# name=skx
[root@oldboy99-Kylin /server/scripts]# expr $name + 1
expr: 非整數參數
[root@oldboy99-Kylin /server/scripts]# echo $?
2
# 計算字符串長度
[root@oldboy99-Kylin /server/scripts]# expr length skx123oldboy
12
[root@oldboy99-Kylin /server/scripts]# expr length $name
3
# 變量擴展符也能顯示字符長度
[root@oldboy99-Kylin /server/scripts]# echo ${#name}
3
2.4 let
let 命令是 BASH 中用于計算的工具,用于執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量。如果表達式中包含了空格或其他特殊字符,則必須引起來。
- let的結果必須用變量來接收,并直接修改原變量內容
- let的結果只能是整數
[root@oldboy99-Kylin /server/scripts]# echo $n
10
[root@oldboy99-Kylin /server/scripts]# let n=10+2
[root@oldboy99-Kylin /server/scripts]# echo $n
12
[root@oldboy99-Kylin /server/scripts]# let n=10-2
[root@oldboy99-Kylin /server/scripts]# echo $n
8
[root@oldboy99-Kylin /server/scripts]# let n=10*2
[root@oldboy99-Kylin /server/scripts]# echo $n
20
[root@oldboy99-Kylin /server/scripts]# let n=10/2
[root@oldboy99-Kylin /server/scripts]# echo $n
5
[root@oldboy99-Kylin /server/scripts]# let n=10^2
[root@oldboy99-Kylin /server/scripts]# echo $n
8
[root@oldboy99-Kylin /server/scripts]# let n=10%2
[root@oldboy99-Kylin /server/scripts]# echo $n
0
[root@oldboy99-Kylin /server/scripts]# let n=10/3
[root@oldboy99-Kylin /server/scripts]# echo $n
3
# 使用let自增或自減
[root@oldboy99-Kylin /server/scripts]# let n++
[root@oldboy99-Kylin /server/scripts]# echo $n
4
[root@oldboy99-Kylin /server/scripts]# let n--
[root@oldboy99-Kylin /server/scripts]# echo $n
3
2.5 案例-計算內存的空閑率
- 注意單位
[root@oldboy99-Kylin /server/scripts]# free -k |awk 'NR==2{print $NF/$2*100"%"}'
55.9613%
[root@oldboy99-Kylin /server/scripts]# free -m |awk 'NR==2{print $NF/$2*100"%"}'
55.8017%
2.6 案例-檢查域名過期時間和https證書過期時間
- 檢查域名過期時間:
whois 二級域名
,關鍵詞:Expiration Date - 檢查https證書過期時間:
curl -v https://www.二級域名
,關鍵詞:expire date - -v:顯示請求與響應的詳細信息
- date
- -d " ":讀取字符串時間
- +%s:獲取時間戳
[root@oldboy99-Kylin /server/scripts]# cat check_domain_https_expire.sh
#!/bin/bash
##############################################################
# File Name: check_domain_https_expire.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:檢查域名和https證書過期時間
##############################################################
export LANG=en_US.UTF-8
# vars
time_stamp=`date +%s`# command
while true
do
# 用戶需要輸入一個二級域名read -p "請輸入一個二級域名:" domain
# 檢查用戶輸入的域名[[ $domain =~ ^[^\ ]+\.[a-z]+$ ]] || {echo "輸入的二級域名有誤,請重新輸入"continue}
# 檢查域名過期時間expire_domain=`date -d $(whois ${domain} |awk -F ': ' '/Expiration Date/{print $2}') +%s`
# 檢查https證書過期時間expire_https=`date -d "$(curl -v https://www.${domain} |& awk -F ': ' '/expire date/{print $2}')" +%s`
# 計算相差時間days_domain=`echo "(${expire_domain}-${time_stamp})/60/60/24" |bc`days_https=`echo "(${expire_https}-${time_stamp})/60/60/24" |bc`
cat <<EOF${domain}:域名還有${days_domain}天過期"https證書還有${days_https}天過期"
EOFexit
done
[root@oldboy99-Kylin /server/scripts]# bash check_domain_https_expire.sh
請輸入一個二級域名:baidu 123.com
輸入的二級域名有誤,請重新輸入
請輸入一個二級域名:baidu.combaidu.com:域名還有1222天過期"https證書還有62天過期"
3. 循環
3.1 循環控制語句
循環控制 | 說明 |
---|---|
exit | 退出腳本 |
continue | 跳過本次循環,進入下一次循環 |
break | 打斷,結束循環 |
return | 函數返回值 |
3.2 for循環-c語言格式
[root@oldboy99-Kylin /server/scripts]# cat test.sh
#!/bin/bash
##############################################################
# File Name: test.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################
for(( i=1;i<=10;i++))
doecho $i
done
[root@oldboy99-Kylin /server/scripts]# bash test.sh
1
2
3
4
5
6
7
8
9
10
3.3 while循環
3.3.1 案例-猜數字
- 生成隨機數:$RANDOM,隨機數范圍:0-32767
- 32767是16位二進制無符號整數,數值位全為1
- 生成1-100之間的隨機數:$RANDOM%100+1
[root@aliyun-ubuntu /server/scripts]# cat GuessNumber.sh
#!/bin/bash
##############################################################
# File Name: GuessNumber.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:Guess the numbers
##############################################################
export LANG=en_US.UTF-8# vars
# random num
num=$(($RANDOM%100+1))# command
while true
doread -p "Please enter the number you guessed (1-100):" user# check user para[[ $user =~ ^[0-9]+$ ]] || {echo "Please enter a number (1-100):"continue}if [ $user -eq $num ];thenecho "Congratulations, you guessed right"exitelif [ $user -gt $num ];thenecho "Guess too big"elseecho "Guess too small"fi
done[root@aliyun-ubuntu /server/scripts]# bash GuessNumber.sh
Please enter the number you guessed (1-100):50
Guess too small
Please enter the number you guessed (1-100):60
Guess too small
Please enter the number you guessed (1-100):70
Guess too small
Please enter the number you guessed (1-100):80
Guess too big
Please enter the number you guessed (1-100):75
Guess too big
Please enter the number you guessed (1-100):74
Guess too big
Please enter the number you guessed (1-100):73
Guess too big
Please enter the number you guessed (1-100):72
Congratulations, you guessed right
3.3.2 讀取文件
- while讀取文件時是按行讀取的
[root@aliyun-ubuntu /server/scripts]# cat read_file.sh
#!/bin/bash
##############################################################
# File Name: read_file.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################
export LANG=en_US.UTF-8# vars
file=$1
# check para
[ $# -eq 0 ] && {echo "Usage:$0 filename"exit 1
}
while read line
doecho $line
done < $file
[root@aliyun-ubuntu /server/scripts]# bash read_file.sh /etc/passwd |head
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
3.3.3 案例-讀取文件,批量ping和wget
- ping -W 數字:每次請求的超時時間,單位秒
- wget:
- -S/–spider:不下載任何文件
- -T 數字:設置連接請求的超時時間,單位秒
- -t 數字:設置重試次數
[root@oldboy99-Kylin /server/scripts]# cat check_ping_wget.sh
#!/bin/bash
##############################################################
# File Name: check_ping_wget.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:讀取文件,批量ping和wget
##############################################################
export LANG=en_US.UTF-8# vars
file=$1# command
[ $# -eq 0 ] && {echo "$0 filename(has ip/domain ……)"exit 1
}
while read line
doping -c 2 -W 1 $line >/dev/null 2>&1[ $? -eq 0 ] && echo "$line 可以ping通" || echo "$line 不能ping通"wget -S -T 1 -t 1 $line >/dev/null 2>&1[ $? -eq 0 ] && echo "$line 可以訪問" || echo "$line 不能訪問"echo "-----------------------"
done < $1
[root@oldboy99-Kylin /server/scripts]# bash check_ping_wget.sh ./log/ip.txt
10.0.0.200 可以ping通
10.0.0.200 不能訪問
-----------------------
baidu.com 可以ping通
baidu.com 可以訪問
-----------------------
jd.com 可以ping通
jd.com 可以訪問
-----------------------
csdn.net 可以ping通
csdn.net 可以訪問
-----------------------
4. 踩坑記錄
1. -bash: 條件表達式中有語法錯誤
修改:
- 空格:[:space:]
- 或者將空格轉義
5. 思維導圖
【金山文檔 | WPS云文檔】 思維導圖 https://kdocs.cn/l/co3I7PtpTYQX