Linux入门DAY29
Linux入门DAY29
if 条件语句
语法
if <条件表达式>;then指令
fi
if单分支
if判断sshd是否运行,未运行则启动服务,启动则返回提示
[phoenix@controller ~ 10:14:18]$ vim testif.sh
#!/bin/bashif systemctl status sshd | grep -q inactive;then
systemctl start sshd && echo sshd success
else echo "sshd started"
fi[phoenix@controller ~ 10:16:19]$ sudo bash testif.sh
sshd started
[phoenix@controller ~ 10:16:29]$ sudo systemctl stop sshd
[phoenix@controller ~ 10:16:40]$ sudo bash testif.sh
sshd success
if双分支
[phoenix@controller ~ 10:27:07]$ vim testif2.sh#!/bin/bashif systemctl status sshd | grep -q inactive;then
systemctl start sshd && echo sshd success
else echo "sshd started"
fi[phoenix@controller lab 10:33:33]$ bash testif2.sh
Usage: testif2.sj start|stop|status
if条件语句应用
#判断字符串是否为数字
#思路一 输出hello123 sed替换数字为空格
# 判断字符串长度是否为0
[phoenix@controller ~ 17:14:49]$ [ -n "$(echo hello123|sed 's/[0-9]//g')" ] && echo char || echo int
char#123为数字 判断为0
[phoenix@controller ~ 17:15:00]$ [ -n "$(echo 123|sed 's/[0-9]//g')" ] && echo char || echo int
int
shell函数
语法
function 函数名 () {指令...return n
}#简写
函数名 () {指令...return n
}
shell函数应用
#示例一 hello函数 先定义后调用
[phoenix@controller lab 17:34:40]$ cat fun1.sh
#!/bin/bash
function hello(){echo "hello world ! "
}
hello
[phoenix@controller lab 17:34:48]$ bash fun1.sh
hello world !#示例二 调用外部函数
[phoenix@controller lab 17:35:08]$ cat mylib
function hello (){echo "hello world ! "
}
[phoenix@controller lab 17:34:52]$ cat fun3.sh
#!/bin/bash
if [ -r mylib ];thensource mylib
elseecho mylib is not existexit 1
fi
hello
[phoenix@controller lab 17:36:03]$ bash fun3.sh
hello world ! #示例三 带参数的函数
[phoenix@controller lab 17:36:19]$ cat fun4.sh
#!/bin/bash
function print () {if [ "$1" == "PASS" ];thenecho -e '\033[1;32mPASS\033[0;39m'elif [ "$1" == "FAIL" ];thenecho -e '\033[1;31mFAIL\033[0;39m'elif [ "$1" == "DONE" ];thenecho -e '\033[1;35mDONE\033[0;39m'elseecho "Usage: print PASS|FAIL|DONE"fi
}
read -p "请输入你想要打印的内容:" str
print $str[phoenix@controller lab 17:37:23]$ bash fun4.sh
请输入你想要打印的内容:hello
Usage: print PASS|FAIL|DONE
[phoenix@controller lab 17:37:38]$ bash fun4.sh
请输入你想要打印的内容:PASS
PASS
[phoenix@controller lab 17:37:43]$ bash fun4.sh
请输入你想要打印的内容:FAIL
FAIL
[phoenix@controller lab 17:37:52]$ bash fun4.sh
请输入你想要打印的内容:DONE
DONE#示例四 hello函数的变量调用
[phoenix@controller lab 17:40:45]$ cat fun5.sh
#!/bin/bash
function print () {if [ "$1" == "PASS" ];thenecho -e '\033[1;32mPASS\033[0;39m'elif [ "$1" == "FAIL" ];thenecho -e '\033[1;31mFAIL\033[0;39m'elif [ "$1" == "DONE" ];thenecho -e '\033[1;35mDONE\033[0;39m'elseecho "Usage: $0 PASS|FAIL|DONE"
fi
}
str=$2
print $str
[phoenix@controller lab 17:40:49]$ bash fun5.sh
Usage: fun5.sh PASS|FAIL|DONE
[phoenix@controller lab 17:41:03]$ bash fun5.sh PASS
Usage: fun5.sh PASS|FAIL|DONE
[phoenix@controller lab 17:41:08]$ bash fun5.sh DONE
Usage: fun5.sh PASS|FAIL|DONE#执行逻辑
#step1 执行str=$2
#step2 赋值给print
#step3 此时$1是$str的值
shell函数递归
[phoenix@controller lab 18:55:22]$ bash sum.sh
1+2+3+4+5+6+7+8+9+10 = 55[phoenix@controller lab 18:55:28]$ cat sum.sh
#!/bin/bash#-eq 对比数字 当递归到1时直接返回1
#else执行递归
sum() {local n=$1if [ $n -eq 1 ]; thenecho 1else#递归调用n + sum(n-1)local prev=$(sum $((n-1)))echo $((n + prev))fi
}#调用函数计算1到10的和
#sum自增10次的和
result=$(sum 10)
echo "1+2+3+4+5+6+7+8+9+10 = $result"
case条件语句
case的功能替代了if/else的多分支条件语句,在case语句中,程序会将case获取的变量的值与表达式部分的值1、值2、值3等逐个进行比较,如果获取的变量值匹配和case项匹配,就会执行指令,直到执行到双分号(;;)才停止,然后跳出case语句
语法
case "变量值" in值1)指令1...;;值2)指令2...;;*)指令3...;;
esac
case条件语句应用
[phoenix@controller lab 19:05:22]$ cat case.sh
#case 变量 in
#!/bin/bash
case $1 instart)systemctl start sshd;;stop)systemctl stop sshd;;restart|reload) systemctl restart sshd;;(*)echo "Usage,case.ssh start|stop|restart/loead||status";;
esac[phoenix@controller lab 19:05:37]$ bash case.sh
Usage,case.ssh start|stop|restart/loead||status#case2 是更简明的写法
[phoenix@controller lab 19:05:39]$ cat case2.sh
#!/bin/bash
case $1 instart|stop|restart|reload|status)systemctl $1 sshd
;;*)echo "Usage:case-ssh start|stop|reload|status"
;;
esac[phoenix@controller lab 19:05:44]$ bash case2.sh
Usage:case-ssh start|stop|reload|status[phoenix@controller lab 19:05:49]$ bash case2.sh start
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: phoenix
Password:
==== AUTHENTICATION COMPLETE ===[phoenix@controller lab 19:06:09]$ bash case2.sh stop
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: phoenix
Password:
==== AUTHENTICATION COMPLETE ===[phoenix@controller lab 19:06:44]$ bash case2.sh restart
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: phoenix
Password:
==== AUTHENTICATION COMPLETE ===
服务器批量管理
主机名 | IP 地址 |
---|---|
ha1.market.com | 10.1.8.21 |
ha2.market.com | 10.1.8.22 |
proxy1.market.com | 10.1.8.23 |
proxy2.market.com | 10.1.8.24 |
company1.market.com | 10.1.8.25 |
company2.market.com | 10.1.8.26 |
shop1.market.com | 10.1.8.27 |
shop2.market.com | 10.1.8.28 |
db1.market.com | 10.1.8.29 |
db2.market.com | 10.1.8.30 |
storage.market.com | 10.1.8.31 |
backup.market.com | 10.1.8.32 |
network.market.com | 10.1.8.33 |
client.market.com | 10.1.8.34 |
[phoenix@controller ~ 19:57:59]$ cat sethost
#!/bin/bash
#定义变量 网卡和与域名
interface=ens33
domain=market.com#usage 提示错误信息
#exit 退出码1 执行失败
usage (){echo "Usage: $0 21-34"exit 1
}#定义函数 设置ip
#当$setip小于0退出
function set_ip () {if [ $# -eq 0 ]; thenusage elsenmcli connection modify $interface ipv4.address 10.1.8.$1/24nmcli connection up $interfacefi}#hostname函数
function set_host () {case $1 in21|22)HOSTNAME=ha$[ $1 - 20 ].$domain;;23|24)HOSTNAME=proxy$[ $1 - 22 ].$domain;;25|26)HOSTNAME=company$[ $1 - 24 ].$domain;;27|28)HOSTNAME=shop$[ $1 - 26 ].$domain;;29|30)HOSTNAME=db$[ $1 - 28 ].$domain;;31)HOSTNAME=storage.$domain;;32)HOSTNAME=backup.$domain;;33)HOSTNAME=network.$domain;;34)HOSTNAME=client.$domain;;*)usage;;esachostnamectl set-hostname $HOSTNAME
}
#main函数
function main() {set_ip $1set_host $1
}main $*
while循环
[phoenix@controller ~ 22:27:54]$ bash while.sh
20
[phoenix@controller ~ 22:27:56]$ cat while.sh
#!/bin/bash
i=10
while [ $i -lt 20 ]
do i=$((i + 1))
done
echo $i#while 当$i小于20循环
#do i=i+1
until循环
[phoenix@controller ~ 23:15:53]$ bash until.sh
i got money ....
i got this
i have to go to the bank
[phoenix@controller ~ 23:15:55]$ cat until.sh
#!/bin/bashtarget=1000000
money=100000
until(($money>=$target))
doecho "i got money ...."sleep 0.01money=$[money+1000000]echo "i got this"
done
echo i have to go to the bank#target变量
#money变量#until money>target
#do 0.01s +100000money
#满足条件后跳出until输出echo
for循环
算法实践
九九乘法表
[phoenix@controller ~ 23:29:15]$ bash nine.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
[phoenix@controller ~ 23:29:16]$ cat nine.sh
#!/bin/bashfor i in $(seq 1 9)
dofor j in $(seq 1 $i)doproduct=$((i * j))printf "%d*%d=%-2d " $j $i $productdoneecho
done#seq 输出数字列
#for 第一层循环i=1-9
#for 第二层循环j输出1-9($i)
#product变量存储i*j乘积
#printf 控制格式
#%d*%d=%-2d 格式化字符串 -2 左对齐占2个字符宽度
#done 每完成一次循环(一行)换行
三对元素配对
3个新郎为A、B、C,3个新娘为X、Y、Z。有人想知道究竟谁与谁结婚,于是就问新人中的三位,得到如下结果:
- A说他将和X结婚;
- X说她的未婚夫是C;
- C说他将和Z结婚。
这人事后知道他们说的全是假话。那么,究竟谁与谁结婚呢?
解题思路:
- 都是假话可以根据条件判断
- 多个人不能同时和一个人结婚
- A不等于X
- X不等于C
- C不等于Z
- B=X Z=A C=Y
#!/bin/bash
for A in X Y Z
dofor B in X Y Zdofor C in X Y Zdoif [ "$A" != "$B" -a "$A" != "$C" -a "$B" != "$C" -a "$A" != "X" -a "$C" != "X" -a "$C" != "Z" ];thenecho A 与 $A 结婚echo B 与 $B 结婚echo C 与 $C 结婚fidonedone
done#for A 在三个元素中do
#for B 在三个元素中do
#for C 在三个元素中do
#在C的for循环do条件判断
#if A不等于B A不等于C
# B不等于C A不等于X
# C不等于X C不等于Z
#条件判断输出