Linux入门DAY29

Linux入门DAY29

if 条件语句

语法

bash 复制代码
if <条件表达式>;then
  指令
fi

if单分支

if判断sshd是否运行,未运行则启动服务,启动则返回提示

bash 复制代码
[phoenix@controller ~ 10:14:18]$ vim testif.sh
#!/bin/bash

if 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双分支

bash 复制代码
[phoenix@controller ~ 10:27:07]$ vim testif2.sh

#!/bin/bash

if 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条件语句应用

bash 复制代码
#判断字符串是否为数字
#思路一 输出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函数

语法

bash 复制代码
function 函数名 () {
  指令...
  return n
}

#简写
函数名 () {
  指令...
  return n
}

shell函数应用

bash 复制代码
#示例一 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 ];then
	source mylib
else
	echo mylib is not exist
	exit 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" ];then
    echo -e '\033[1;32mPASS\033[0;39m'
  elif [ "$1" == "FAIL" ];then
    echo -e '\033[1;31mFAIL\033[0;39m'
  elif [ "$1" == "DONE" ];then
    echo -e '\033[1;35mDONE\033[0;39m'
  else
    echo "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" ];then
    echo -e '\033[1;32mPASS\033[0;39m'
  elif [ "$1" == "FAIL" ];then
    echo -e '\033[1;31mFAIL\033[0;39m'
  elif [ "$1" == "DONE" ];then
    echo -e '\033[1;35mDONE\033[0;39m'
  else
    echo "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函数递归

bash 复制代码
[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=$1
    if [ $n -eq 1 ]; then
        echo 1
    else
        #递归调用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语句

语法

bash 复制代码
case "变量值" in
  值1)
    指令1...
    ;;
  值2)
    指令2...
    ;;
  *)
    指令3...
    ;;
esac

case条件语句应用

bash 复制代码
[phoenix@controller lab 19:05:22]$ cat case.sh 
#case 变量 in
#!/bin/bash
case $1 in
 start)
   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 in
	start|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
bash 复制代码
[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 ]; then
    usage   
  else
	  nmcli connection modify $interface ipv4.address 10.1.8.$1/24
	  nmcli connection up $interface
  fi
	
}

#hostname函数
function set_host () {
	case $1 in
		21|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
			;;
	esac
	hostnamectl set-hostname $HOSTNAME
}
#main函数
function main() {
	set_ip $1
	set_host $1
}

main $*

while循环

bash 复制代码
[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循环

bash 复制代码
[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/bash

target=1000000
money=100000
until(($money>=$target))
do
  echo "i got money ...."
  sleep 0.01
  money=$[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循环

算法实践

九九乘法表

bash 复制代码
[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/bash

for i in $(seq 1 9)
do
    for j in $(seq 1 $i)
    do
        product=$((i * j))
        printf "%d*%d=%-2d " $j $i $product
    done
    echo
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结婚。

这人事后知道他们说的全是假话。那么,究竟谁与谁结婚呢?

解题思路

  1. 都是假话可以根据条件判断
  2. 多个人不能同时和一个人结婚
  3. A不等于X
  4. X不等于C
  5. C不等于Z
  6. B=X Z=A C=Y
bash 复制代码
#!/bin/bash
for A in X Y Z
do
  for B in X Y Z
  do
    for C in X Y Z
    do
      if [ "$A" != "$B" -a "$A" != "$C" -a "$B" != "$C" -a "$A" != "X" -a "$C" != "X" -a "$C" != "Z" ];then
        echo A 与 $A 结婚
        echo B 与 $B 结婚
        echo C 与 $C 结婚
      fi
    done
  done
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
#条件判断输出
相关推荐
多吃蔬菜!!!1 小时前
vscode 搭建C/C++开发环境搭建(linux)
linux·c语言·c++
李李李li1 小时前
Ubuntu 22.04 安装tensorrt
linux·tensorrt
一休哥助手3 小时前
Naive RAG:简单而高效的检索增强生成架构解析与实践指南
运维·人工智能·架构
入秋3 小时前
Linux服务器安装部署 Nginx、Redis、PostgreSQL、Docker
linux·前端
Bi3 小时前
包含多个子项目集成一个项目部署Vercel方法
运维·前端
Mr. Cao code4 小时前
使用Tomcat Clustering和Redis Session Manager实现Session共享
java·linux·运维·redis·缓存·tomcat
zcz16071278214 小时前
Linux 网络命令大全
linux·运维·网络
the sun344 小时前
Reactor设计模式及其在epoll中的应用
linux·运维·服务器·c++
VVVVWeiYee4 小时前
BGP高级特性
运维·服务器·网络