前言:
單引號表示純符號 用雙引號表字符串
- case多分支語句
- 循環語句
- for循環語句
- while循環語句
- until循環語句
- shell函數
- shell數組
一 : case語句的結構
1.1 case結構
-
多分支表現形式:if語句,case語句
-
case 語句可以使用正則表達式,正則表達式後面會去闡述
- 針對變量的不同取值,分別執行不同的命令程序
case 中;;表示一句話的結束
如果匹配某一個固定值,大多數用caes,其適用於某一個固定值
如果匹配某一個區間範圍,大多數用if else 語句,其適用於一個範圍
*後面 不需要加;;
1.2 case執行過程流程圖
-
case針對變量的不同取值,分別執行不同的命令序列
- case變量匹配的是模式,if變量匹配的是條件
1.3 case語句應用示例
1.3.1 示例1:擊鍵類型識別
- 提示用戶輸入一個字符
- 判斷出該字符是字母、數字或者其他字符
#/bin/bash
read -p "請按個鍵,我可以測試年的鍵是字母數字或是其他字符" jian
case "$jian" in
[0-9])
echo "你按的是數字"
;;
[a-z]|[A-Z])
echo "你按的是字母"
;;
*)
echo "你按的是特殊字符"
esac
[root@localhost opt]# sh shibiejijian.sh
請按個鍵,我可以測試年的鍵是字母數字或是其他字符8
你按的是數字
[root@localhost opt]# sh shibiejijian.sh
請按個鍵,我可以測試年的鍵是字母數字或是其他字符a
你按的是字母
[root@localhost opt]# sh shibiejijian.sh
請按個鍵,我可以測試年的鍵是字母數字或是其他字符A
你按的是字母
[root@localhost opt]# sh shibiejijian.sh
請按個鍵,我可以測試年的鍵是字母數字或是其他字符@
你按的是特殊字符
1.3.2 請輸入您的成績判斷優良合格不合格
#!/bin/bash
read -p "請輸入您的成績" cj
case "$cj" in
[0-9]|[1-5][0-9])
echo "成績不合格"
;;
7[0-4]|6[0-9])
echo "成績合格"
;;
7[5-9]|8[0-4])
echo "成績良好"
;;
8[5-9]|9[0-9]|100)
echo "成績優秀"
;;
*)
echo "你輸入的成績有誤"
esac
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績-1
你輸入的成績有誤
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績0
成績不合格
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績9
成績不合格
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績10
成績不合格
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績59
成績不合格
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績60
成績合格
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績74
成績合格
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績75
成績良好
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績7^H84
你輸入的成績有誤
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績84
成績良好
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績85
成績優秀
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績99
成績優秀
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績100
成績優秀
[root@localhost opt]# sh chengjicase.sh
請輸入您的成績101
你輸入的成績有誤
[root@localhost opt]#
1.3.3 示例2:編寫系統服務腳本
- 使用start、stop、restart等參數來控制服務
- 服務控制指令通過位置變量 $1 傳入
二 : for語句的循環結構
2.1 for語句概述
- 讀取不同的變量值,用來逐個執行同一組命令
控制循環的中斷
取值列表是一個集合;
自上而下進行依次讀取賦值執行命令的操作叫做遍歷,
for可以視爲在超市進行購物車結算的掃碼槍
2.2 for語句流程圖
2.3 for語句應用實例
2.3.1 示例1——批量添加用戶
- 用戶名存放在users.txt文件中,每行一個
- 初始密碼設爲123456
- 驗證腳本
#!/bin/bash
for ((i=1;i<=4;i++))
do
useradd "admin$i" &> /dev/null
echo "123456" | passwd --stdin "admin$i" &> /dev/null
echo "用戶admin$i創建成功"
done
~
[root@localhost opt]# sh users.sh
用戶admin1創建成功
用戶admin2創建成功
用戶admin3創建成功
用戶admin4創建成功
2.3.2 示例2——使用根據IP地址檢查主機狀態
- IP地址存放在ipadds.txt文件中,每行一個
- 使用ping命令檢測各主機的連通性
[root@localhost opt]# vim addr.sh
#!/bin/bash
List=$(cat /opt/ipadds.txt)
for ((i=0;i<=256;i++))
do
ping -c 3 -i 0.2 -W 1 192.168.10.$i &> /dev/null
if [ $? = 0 ]
then
echo "192.168.10.$i is up"
else
echo "192.168.10.$i is down"
fi
done
2.3.3 將1-10從上往下排列
#!/bin/bash
for ((i=1;i<=10;i++))
do
echo "$i"
done
for的雙分號不能拆掉
2.3.4: 1-100的偶數和
sum=0
for ((i=0;i<=100;i+2))
do
let sum+=$i
done
echo "$sum"
i+=2 代表i=i+2
continue 跳過自己部分的語句,重新循環
let 命令 ,重新賦值的意思,相當於在sum的基礎上,再加一個數
break 看到break後,直接退出循環
$RANDOM是隨機值
用其取餘可以固定隨機數的範圍
2.3.5 猜價格
- 方法一
#!/bin/bash
echo "話不多說,過來猜價格"
b=`expr $RANDOM % 1000`
n=0
read -p "輸入你心中的數,猜猜今天的優惠商品的價格(0-999)?" a
while [ $a -ne $b ]
do
if [ $a -gt $b ]
then
echo "你把它想得太貴了"
read -p "輸入你心中的數,猜猜今天的優惠商品的價格(0-999)?" a
let n++
else
echo "你太低估它的價格了"
let n++
read -p "輸入你心中的數,猜猜今天的優惠商品的價格(0-999)?" a
fi
done
let n++
echo "恭喜你猜對了,他的價格是$b,你一共猜了$n次可惜你沒錢買"
exit 0
- 方法二
#!/bin/bash
n=0
echo "這是一個猜價格的遊戲,價格在1~1000的範圍內."
jiage=$(expr $RANDOM % 1000)
while true
do
read -p "請輸入你猜的價格:" cai
if [ $cai -eq $jiage ]
then
let n++
echo "恭喜你猜對了!它的價格是:$jiage.你一共猜了$n次."
exit 0
elif [ $cai -gt $jiage ]
then
let n++
echo "你猜的價格高了,猜低一點."
elif [ $cai -lt $jiage ]
then
let n++
echo "你猜的價格低了,猜高一點."
fi
done
2.3.6 九九乘法表
- 方法一
#!/bin/baash
for ((i=1;i<=9;i++))
do
for ((a=1;a<=i;a++))
do
echo -n "$i x $a=$(expr $i \* $a) "
if [ $a -eq $i ]
then
echo -e '\n'
fi
done
done
- 方法二
echo 的help幫助
NAME(名稱)
echo - 顯示一行文本
SYNOPSIS(總覽)
echo[OPTION]... [STRING]...
DESCRIPTION(描述)
允許在標準輸出上顯示STRING(s).
-n 不輸出行尾的換行符.
-e 允許對下面列出的加反斜線轉義的字符進行解釋.
-E 禁止對在STRINGs中的那些序列進行解釋.
--help 顯示幫助並退出(須單獨運行)
--version 輸出版本信息並退出(須單獨運行)
在沒有 -E 的情況下,可承認並可以內置替換以下序列:
\NNN 字符的ASCII代碼爲NNN(八進制)
\\ 反斜線
\a 報警符(BEL)
\b 退格符
\c 禁止尾隨的換行符
\f 換頁符
\n 換行符
\r 回車符
\t 水平製表符
\v 縱向製表符
- 菱形的九九乘法表
#!/bin/bash
for ((i=1;i<=17;i++))
do
if [ $i -le 9 ];then
k=$(expr 45 - $(expr $i \* 5))
until [ $k -eq 0 ]
do
echo -n " "
let k-=5
done
for ((j=1;j<=i;j++))
do
echo -n "$i*$j=$(expr $i \* $j) "
if [ $i -eq $j ]
then
echo -e '\n'
fi
done
else
xi=$(expr 18 - $i)
xk=$(expr 45 - $(expr $xi \* 5))
until [ $xk -eq 0 ]
do
echo -n " "
let xk-=5
done
for ((xj=1;xj<=xi;xj++))
do
echo -n "$xi*$xj=$(expr $xi \* $xj) "
if [ $xj -eq $xi ]
then
echo -e '\n'
fi
done
fi
done
三 : while語句的結構
3.1 while語句概述
- 重複測試某個條件,只要條件成立則反覆執行
3.2 while 語句應用示例
3.2.1 逛商業街
- 方法一
#!/bin/bash:
echo "歡迎來到商業街,走一走逛一逛"
qian=0
a=1.電腦城
b=2.服裝店
c=3.饅頭店
d=4.泳裝店
goumai=你購買了
while true
do
echo "1.電腦城"
echo "2.服裝店"
echo "3.饅頭店"
echo "4.泳裝店"
read -p "商業街上有電腦城、服裝店、饅頭店、泳裝店,你想去哪一個瞅瞅?(輸入序號)" nub
case $nub in
1)
echo “===========歡迎進入電腦城==========================”
echo "1.手機800元"
echo "2.電腦1200元"
echo "3.充電器線15元"
echo "4.鍵盤100元"
read -p "有以上商品供你選購---有你想買的東西嗎?(yes/no)" yesno
while true
do
if [ $yesno = yes ]
then
read -p "輸入你想買的商品序號" xuhao
case $xuhao in
1)
echo "你購買了價值800元的手機"
let qian=800+$qian
goumai=$goumai手機、
;;
2)
echo "你購買了價值1200元的電腦"
qian=`expr $qian + 1200`
goumai=$goumai手機、
;;
3)
echo "你購買了價值15元的充電線"
qian=`expr $qian + 15`
goumai=$goumai手機、
;;
4)
echo "你購買了價值100元的鍵盤"
qian=`expr $qian + 100`
goumai=$goumai手機、
;;
*)
echo "店裏沒有你想要的東西"
break
esac
else
echo "沒有想買的那我們就走"
break
fi
done
;;
2)
echo “===========歡迎進入服裝店==========================”
echo "1.鞋子120元"
echo "2.褲子85元"
echo "3.帽子15元"
echo "4.皮帶320元"
read -p "有以上商品供你選購---有你想買的東西嗎?(yes/no)" yesno
while true
do
if [ $yesno = yes ]
then
read -p "輸入你想買的商品序號" xuhao
case $xuhao in
1)
echo "你購買了價值120元的鞋子"
let qian=120+$qian
goumai=$goumai鞋子、
;;
2)
echo "你購買了價值85元的褲子"
qian=`expr $qian + 85`
goumai=$goumai褲子、
;;
3)
echo "你購買了價值15元的帽子"
qian=`expr $qian + 15`
goumai=$goumai帽子、
;;
4)
echo "你購買了價值320元的皮帶"
qian=`expr $qian + 320`
goumai=$goumai皮帶、
;;
*)
echo "店裏沒有你想要的東西"
break
esac
else
echo "沒有想買的那我們就走"
break
fi
done
;;
3)
echo “===========歡迎進入饅頭店==========================”
echo "1.山東雜糧大煎餅15元"
echo "2.青島大龍蝦餡兒包子15元"
echo "3.簡單的白饅頭1元"
echo "4.不簡單的白饅頭1000元"
read -p "有以上商品供你選購---有你想買的東西嗎?(yes/no)" yesno
while true
do
if [ $yesno = yes ]
then
read -p "輸入你想買的商品序號" xuhao
case $xuhao in
1)
echo "你購買了價值15元的山東雜糧大煎餅"
let qian=15+$qian
goumai=$goumai山東雜糧大煎餅、
;;
2)
echo "你購買了價值15元的青島大龍蝦餡兒包子"
qian=`expr $qian + 15`
goumai=$goumai青島大龍蝦包子、
;;
3)
echo "你購買了一個簡單的白饅頭"
qian=`expr $qian + 1`
goumai=$goumai白饅頭、
;;
4)
echo "你購買了不簡單的白饅頭,獲取了老闆娘的芳心"
qian=`expr $qian + 1000`
goumai=$goumai老闆娘的芳心、
;;
*)
echo "店裏沒有你想要的東西"
break
esac
else
echo "沒有想買的那我們就走"
break
fi
done
;;
4)
echo “===========歡迎進入泳裝店==========================”
echo "1.泳帽10元"
echo "2.泳衣15元"
echo "3.泳鏡12元"
echo "4.比基尼32元"
read -p "有以上商品供你選購---有你想買的東西嗎?(yes/no)" yesno
while true
do
if [ $yesno = yes ]
then
read -p "輸入你想買的商品序號" xuhao
case $xuhao in
1)
echo "你購買了價值10元的泳帽"
let qian=10+$qian
goumai=$goumai泳帽、
;;
2)
echo "你購買了價值15元的泳衣"
qian=`expr $qian + 15`
goumai=$goumai泳衣、
;;
3)
echo "你購買了價值12元的泳鏡"
qian=`expr $qian + 12`
goumai=$goumai泳鏡、
;;
4)
echo "你購買了價值32元的比基尼"
qian=`expr $qian + 32`
goumai=$goumai比基尼、
;;
*)
echo "店裏沒有你想要的東西"
break
esac
else
echo "沒有想買的那我們就走"
break
fi
done
;;
*)
echo "輸入錯誤,不帶你逛街了"
echo "你這次逛街花了$qian元,$goumai"
exit 1
esac
done
- 方法二
#!/bin/bash
2 qian=0
3 n=0
4 echo "======歡迎來到來了一定讓你掏錢的商業街==============="
5
6 for ((i=1;i<=4;i++));do
7 echo "===========來到第$i家店============="
8 read -p "小帥哥,來玩啊?--是否進店(yes/no)" yesno
9 case $yesno in
10 yes)
11 echo "你不會後悔的,看看商品吧"
12 echo "1.女主播穿過的絲襪300元"
13 echo "2.買了就後悔的瓶子900元"
14 echo "3.會動的可充電扭蛋150元"
15 read -p "你想買哪個呢,一個一個按序號買哦" xuhao
16 case $xuhao in
17 1)
18 echo "你選擇了女主播的襪子,花了300元"
19 let qian+=300
20 let n++
21 ;;
22 2)
23 echo "你選擇了買了就後悔的瓶子,裏面空無一物,白花了900元"
24 let qian+=900
25 let n++
26 ;;
27 3)
28 echo "你選擇了會動的可充電扭蛋,送給女主播會有驚喜哦"
29 let qian+=150
30 let n++
31 ;;
32 *)
33 echo "小夥子,店裏的東西還不齊全,再看看吧"
34 esac
35 while true
36 do
37 read -p "是否繼續看看(yes/no)" yesn
38 if [ $yesn = yes ];then
39 echo "喲吼吼,小夥子挺有錢嘛"
40 echo "你不會後悔的,看看商品吧"
41 echo "1.女主播穿過的絲襪300元"
42 echo "2.買了就後悔的瓶子900元"
43 echo "3.會動的可充電扭蛋150元"
44 read -p "這次又要買什麼呢(請輸入序號)" xuh
45 case $xuh in
46 1)
47 echo "你選擇了女主播的襪子,花了300元"
48 let qian+=300
49 let n++
50 ;;
51 2)
52 echo "你選擇了買了就後悔的瓶子,裏面空無一物,白花了900元"
53 let qian+=900
54 let n++
55 ;;
56 3)
57 echo "你選擇了會動的可充電扭蛋,送給女主播會有驚喜哦"
58 let qian+=150
59 let n++
60 ;;
61 *)
62 echo "小夥子,店裏的東西還不齊全,再看看吧"
63 esac
64 else
65 break
66 fi
67 done
68 ;;
69 no)
70 echo "可惜了,歡迎再次光臨吧"
71 ;;
72 *)
73 echo "小傢伙,你很皮哦,你不進來我還不讓你進呢"
74 esac
75 done
76 echo "=======購物結束,看看自己被宰了多少錢======="
77 echo "你花了$qian元,買了$n個物品"
while true 代表死循環 ,需要在其中加入一個if語句,if語句內含break,用來退出循環
3.2.2 猜猜誰最幸運
- 方法一
#!/bin.bash
n=0
c=0
b=0
for ((i=1;i<=10;i++))
do
shuzi=`expr $(expr $RANDOM % 2) + 1`
xingming=`cat /opt/jbxx/mingdan.txt | grep $shuzi | awk -F: '{print $2}'`
# cat 人員名單
case "$shuzi" in
1)
let n++
;;
2)
let c++
;;
*)
let b++
esac
echo "$xingming"
done
echo "zhangsan $n次、 lisi $c 次、 wangwu $b 次"
-
方法二
- 方法三
3.2.3 批量添加用戶
- 用戶名稱以stu開頭,按數字順序進行編號
- 一共添加20個用戶,即stu1、stu2、stu3·······、stu20
- 初始密碼設爲123456
#!/bin/bash
i=1
until [ $i -gt 20 ];do
useradd stu$i
#echo "123456" | passwd --stdin stu$i &> /dev/null
let i++
echo "用戶stu$i創建成功"
done
===========================================================
#!/bin/bash
i=1
while [ $i -le 20 ];do
userdel -r stu$i
#echo "123456" | passwd --stdin stu$i
let i++
echo "用戶stu$i刪除成功"
done
3.2.4 猜商品價格遊戲
- 通過變量RANDOM獲得隨機數
- 提示用戶猜測並記錄次數,猜中後退出循環
#!/bin/bash
n=1
jiage=$[RANDOM%1000+1]
read -p "請輸入你心中的價格:" cai
while [ $cai != $jiage ];do
if [ $cai -gt $jiage ];then
echo "你輸入的價格高了"
let n++
read -p "請輸入你心中的價格:" cai
else
echo "價格低了"
let n++
read -p "請輸入你心中的價格:" cai
fi
done
echo "恭喜你猜中了,該商品的價格是$jiage,你一共猜了$n次"
exit 0
四 : until 語句
4.1 until語句的結構
4.2 until 語句應用實例
4.2.1計算1-50的和值
- 通過循環累加的方式計算1-50的和值
#!/bin/bash
num=0
n=1
until [ $n -gt 50 ];do
let sum+=$n
let n++
done
echo "$sum"
4.2.2爲指定用戶發送在線消息
-
若用戶不在線(未登錄系統),則每10分鐘試一次,直至用戶登錄系統後再發送信息
-
用戶名與消息通過位置參數傳遞給腳本
-
方法一
#!/bin/bash #判斷是否輸入參數 if [ $# = 0 ];then echo "請輸入用戶名" exit 1 fi #判斷用戶是否存在 if grep "^$1" /etc/passwd &> /dev/null;then : else echo "用戶不存在" exit 2 fi #判斷用戶是否在線 until who | grep "$1" &> /dev/null;do echo "用戶不在線" sleep 3 done #給用戶發消息 echo "$*" | write "$1"
- 方法二
不可以then 和else 中爲空
五 : shell函數
- 將命令序列按格式寫在一起
- 可方便重複使用命令序列
- shell函數定義
- 調用函數的方法
- 函數名 [參數1] [參數2]
- 參數1就是位置參數$1,參數2就是位置參數$2
5.1 函數格式
封裝函數返回值
返回值分兩種,return 狀態 ————調用使用$?
echo 值 ————調用使用賦予變量
狀態用$?調,值用變量調
傳參數用位置變量傳進去
5.2 示例
5.2.1兩個數字求和
- 通過sum (){}定義函數
- 使用read命令交互輸入兩個數並求和
#!/bin/bash
function qiuehe(){
sum=`expr $1 + 10`
#echo "$sum"
return $sum
echo "$?"
}
qiuehe $1
~
5.2.2 編寫登錄系統後便可使用的用戶自定義函數,執行命令servicectl httpd start
- 編輯用戶自定義函數文件/root/function
- 在當前shell中加載可執行的函數文件/root/function
-
在~/.bash文件中添加source /root/function命令
- systemctl start httpd
-
service httpd start
新建一個service httpd start 命令
思路:
1.驗證語法格式
2.驗證版本類型、驗證linux版本,只有centos7,才能使用servicectl命令
查看版本類型 cat /etc/centos-release
3.執行命令servicectl httpd start
- 方法一
#!/bin/bash
function servicectl (){
#判斷格式是否正確
if [ $# -lt 2 ];then
echo "用法錯誤,格式爲:servicectl <服務名> <選項>"
exit 1
fi
#判斷系統版本是否爲centos7版本
if [ $(cat /etc/centos-release |awk '{print $4}' | awk -F. '{print $1}') -ge 7 ];then
echo "符合版本centos7及以上要求,可以使用servicectl 命令"
service $1 $2
else
echo "你版本太低無法使用!"
fi
}
- 方法二
#!/bin/bash
#這是系統啓動後用戶可以使用的一個自定義函數
#功能:開機啓動服務
#判斷使用腳本格式是否正確,即參數個數判斷
function format(){
echo $#
if [ $# -ne 2 ]
then
echo "你輸入的參數格式不正確,UsageMethod:serve <cmd> <serve> "
exit 1
fi
}
#判斷使用的Linux版本是否是Centos7版本
function version(){
echo "hello"
num=$(cat /etc/centos-release |awk '{print $4}' |awk -F. '{print $1}')
if [ $num -eq 7 ]
then
echo "您的系統版本是centos的7版本且準備執行服務啓動腳本,請稍後"
fi
}
#服務啓動
function serve(){
format $1 $2
version
case $2 in
start)
systemctl start httpd
;;
stop)
systemctl stop httpd
;;
*)
echo "nothing need to do"
esac
}
六 : shell數組
6.1 應用場景
組有利於存放相同類型的數據,這句話也適用於java
數組內可以存放數據,數據類型有
1.整型 init 1 2 3 100
2.長整型 long
3.浮點型 單精度 float 4字節,帶小數點就是浮點型
4.string 字符串:char 字符 英文字母字符 a 佔一個字節;中文漢字字符,男 佔兩個字節而在java中,所有字符都佔兩個字節
5.boolean 布爾值 ture 和false
6.date 日期
7.html 標記語言 以標籤形式存在
下標或者索引用來去找數組內的數據
- 獲取數組長度
索引是從0開始,
數組有長度,下面的例子就是4——數組長度
- 獲取元素長度
數組最忌諱越界,越界取決於你的數組長度——abc[4],這樣就是越界了
索引下標一定是0開始
- 遍歷元素
遍歷元素:循環
- 元素切片
- 元素替換
- 元素刪除
- ·······
6.2 數組定義方法
- 數據與數據之間用空格隔開,即數組元素之間使用空格隔開
6.2.1 方法一
數組名 = (value0 value1 value2......)
abc = (10 20 30 )
最簡單的方式,動態輸入,也叫可變長數組
6.2.2 方法二
數組名 = ([0] = value [1] = value [2] = value......)
abc = ([0] = 10 [1] = 20 [2] = 30 .......)
6.2.3 方法三
列表名 = ”value0 value1 value2 ......“
數組名 = ($列表名)
給數組名賦予列表名,列表名裏有數據
6.2.4 方法四
數組名[0]="value" abc[0] = 10
數組名[1]="value" abc[1] = 20
數組名[2]="value" abc[2] = 30
......
這種方法不建議使用
6.3 數組包括的數據類型
- 數值類型
- 字符類型
- 使用”或“定義
不可以放入對象
shell當中沒有二維數組
6.4 shell數組操作
- 獲取數組長度————${數組名[@/*]}
- @或,可以理解爲通配符號,類似於$ ,可以查看數組內的所有數據 ${abc[ * ]}、${abc[@]}
- 讀取某下標賦值————${數組名[下標]}
- ${abc[2]}
- 數組遍歷
- ${#abc[]},即在獲取數組長度的基礎上,在數組名加#,echo查看${#abc[ ]} 該數組的數據個數,類似於$#
- 即:${abc[*]}加#號是統計數字;不加#號,是把數組內的所有位置全部顯示出來
數組遍歷示例
6.4.1 比大小
max=0
for ((i=1;i<=5;i++))
do
read -p "請輸入第$i個數字" num
a=i-1
abc[a]=$num
if [ ${abc[a]} -gt $max ]
then
max=${abc[a]}
fi
done
echo ${abc[*]}
echo "最大值爲 $max"
6.4.2 給數組排序、插數後再排序
#/bin/bash
2 for ((i=1;i<=5;i++))
3 do
4 read -p "請輸入第$i個數字" num
5 a=$i-1
6 c=$a-1
7 abc[a]=$num
8 done
9 #降序
10 b=0
11 for ((j=0;j<=c;j++))
12 do
13 for ((i=0;i<=c;i++))
14 do
15 ii=`expr $i + 1`
16 if [ ${abc[$i]} -le ${abc[$ii]} ]
17 then
18 b=${abc[$i]}
19 abc[$i]=${abc[$ii]}
20 abc[$ii]=$b
21 fi
22 done
23 done
24 echo ${abc[*]}
#升序
25 mb=0
26 for ((j=0;j<=c;j++))
27 do
28 for ((i=0;i<=c;i++))
29 do
30 ii=`expr $i + 1`
31 if [ ${abc[$i]} -ge ${abc[$ii]} ]
32 then
33 mb=${abc[$i]}
34 abc[$i]=${abc[$ii]}
35 abc[$ii]=$mb
36 fi
37 done
38 done
39 echo ${abc[*]}
40 read -p "輸入你想插的數" xnum
41 i=$a+1
42 abc[i]=$xnum
43
44 for ((f=0;f<=i;f++))
45 do
46 for ((g=0;g<=a;g++))
47 do
48 gg=$(expr $g + 1)
49 if [ ${abc[$g]} -le ${abc[$gg]} ]
50 then
51 b=${abc[$g]}
52 abc[$g]=${abc[$gg]}
53 abc[$gg]=$b
54 fi
55 done
56 done
57 echo ${abc[*]}
拓展
1.求ax^2+bx+c=0的解,a、b、c爲手動輸入
- 平方根示例
#!/bin/bash
a=9
b=$(awk -v x=$a 'BEGIN{print sqrt(x)}')
echo $b
b=$(echo "$a" | awk '{print sqrt($1)}')
echo $b
b=$(echo | awk "{print sqrt($a)}")
echo $b
b=$(bc <<< "scale=6; sqrt($a)") #scale=6,表示結果保留6位小數
echo $b
b=$(echo "scale=6; sqrt($a)" | bc)
echo $b
b=`"sqrt($a)"`
echo $b
- 方法
#!bin/bash
echo "求二元一次方程解ax^2 + bx + c = 0"
read -p "請輸入a:" a
read -p "請輸入b:" b
read -p "請輸入c:" c
echo "你輸入的方程爲"$a"x^2 + "$b"x + $c = 0"
if [ $a -eq 0 ]
then
if [ $b -eq 0 ]&&[ $c -ne 0 ]
then
echo "你輸入的格式有誤,a、b、c不能同時等於0,否則x等於任何數"
else
x=`expr $c / $b`
echo "該方程只有一個解,即x=-$x"
fi
else [ $a -ne 0 ]
era=`expr $a \* 2`
b2=`expr $b \* $b`
ac=`expr $a \* $c`
siac=`expr 4 \* $ac`
gx=`expr $b2 - $siac`
if [ $gx -lt 0 ];then echo "無解" && exit 1
fi
gxj=$(bc <<< "sqrt($gx)")
q=`expr 0 - $b`
fs1=`expr $q + $gxj`
fs2=`expr $q - $gxj`
j1=`expr $fs1 / $era`
j2=`expr $fs2 / $era`
echo "x1 = $j1 ;x2 = $j2"
fi
#!/bin/bash
echo please input the number a
read a
echo please input the number b
read b
echo please input the number c
read c
(( d = b*b - 4*a*c))
if [ $a -eq 0 ]
then
(( x = - c/b))
echo the number of x is: $x
elif [ $d -gt 0 ]
then
(( x= a*x*x + b*x +c))
echo the number of x is: $x
else
echo x has no answer
fi
2.購物中心做活動,購買食物滿500元打8折,購買日用滿300元打9折,購買衣服滿1000打7折,每類商品都有三種(分別起名字)
需求:程序運行後可以任意選擇商品類別,進入商品類別後可以選擇不購買或購買哪一個商品,退出某類別後還可以進入該類別進行購買
3.輸入星期幾的英文單詞來判斷星期幾
#!/bin/bash
echo "請輸入星期的英文單詞"
read w
case $w in
Monday)
echo "星期一"
;;
Tuesday)
echo "星期二"
;;
Wednesday)
echo "星期三"
;;
Thursday)
echo "星期四"
;;
Friday)
echo "星期五"
;;
Saturday)
echo "星期六"
;;
Sunday)
echo "星期日"
;;
*)
echo "輸入錯誤"
esac
4.將按順序輸入的5個字符以相反的順序打印出來
#!/bin/bash
echo "請輸入五個字符,以空格隔開"
read a b c d e
echo "$e $d $c $b $a"
5.一個5位數,判斷它是不是迴文數。即12321是迴文數,個位與萬位相同,十位與千位相同。
#!/bin/bash
read -p "請輸入一個五位數字" num
w=$(expr $num / 10000)
q=$(expr $num / 1000)
until [ $q -lt 10 ]
do
let q-=10
done
b=$(expr $num / 100)
until [ $b -lt 10 ]
do
let b-=10
done
s=$(expr $num / 10)
until [ $s -lt 10 ]
do
let s-=10
done
g=$num
until [ $g -lt 10 ]
do
let g-=10
done
if [ $w -eq $g ]&&[ $q -eq $s ]
then
echo "$num這個數是一個迴文數"
else
echo "$num這個數不是迴文數"
fi
總結
1. case語句的結構
2.for語句的結構
3.while語句的結構
4.until語句的結構
5. 數組定義方法
6. shell腳本調試方法
aca認證,acp認證
continue
-z 驗證位置變量是否爲空,使用或||,則中括號爲兩對,
使用source function去加載
作業:做一個菱形