C高级 DAY4

一、分支语句

case ...in语句

shell中的switch语句

复制代码
case $变量名 in
    常量1)
        语句
        ;;       ------->类似于C中break的作用,;;除了最后一条分之外,都不能省略
    常量2)
        语句
        ;;
    ····   
    常量n)
        语句
        ;;
    *)         ------->类似于C中default,但是*表示通配所有情况,只能放在最后
        语句
esac    

其中常用到的条件有

复制代码
1|2|3|4):满足1,2,3,4中任一个即可
[0-9]):满足0-9中任一个
[0-3]|4):满足0-3和4中的任一个   

注意:*通配所有情况,如果想使用*表示其他分支的情况,不能把*放在上面,与default不一样!

二、循环语句

在shell中,循环语句不使用{}作为作用域,使用do..done

1、while

复制代码
while [ test语句 ]   ------>while test 表达式
do
    循环体
done

2、for

for也可以使用c语言风格的格式,或者shell风格的格式,让变量遍历字符串列表

复制代码
第一种:类似于C的格式
for ((表达式1;表达式2;表达式3))
do
    循环体
done
 
第二种:shell中的格式
for 变量名 in 字符串列表
do
    循环体
done

连续使用列表

复制代码
1、seq 起始值 间隔值 终止值 ---->在终端回显,起始到终止值间的连续序列
seq 1 1 100 --->输出1-100    
seq 如果后面只有一个数,默认是终止值,起始值和间隔值默认为1
拿到seq的结果需要使用命令置换符
`seq 1 1 100`
2、{1..3} ---->展开1-3内的每一个数,中间是两个.不能多写

3、select...in

复制代码
select 变量名 in 选项列表
do
    语句块
done

变量名会一一遍历选项列表,遍历次数个选项个数一致

复制代码
执行逻辑:
会在终端打印选项列表,让用户选择,用户选择是需要选择对应的序号,
如果用户不输入直接回车,会再打印一次选项列表,
如果选择错误,变量就获取到空值

一般select与case...in结合使用

复制代码
select i in linux wins macos q Q
do
	case $i in
		linux)
			echo "打开的是Linux系统"
			;;
		wins)
			echo "打开的是wins系统"
			;;
		macos)
			echo "打开的是macos系统"
			;;
		q)
			break
			;;
		Q)
			exit
			;;
		*)
			echo "选择错误"
	esac
done
 
echo hello world

三、辅助控制关键字

与c中跳出循环关键字相似

1、break

退出循环

复制代码
break n    ------->退出n层循环
break 1    ------->1可以不写

2、continue

跳出循环

复制代码
continue n   ------->退出n层本次循环
continue 1   ------->1可以不写

四、函数

由于脚本中是不存在返回值类型,所以在函数名前是function开头(可加可不加)之后形参列表没有参数

bash 复制代码
function  函数名()
{
    函数体
    return 返回值(如果实现函数时有返回值就写return)
}
bash 复制代码
shell中函数的注意事项:
1、function在定义函数时,可以加也可以不加(建议加)
2、()内不能添加任何内容,函数是否有参数根据调用来决定
3、如果函数有返回值,直接在函数的定义中写出return 
4、shell中的函数仍然满足先定义后调用的原则,shell中函数的定义和声明不能分开

外部传参不能传到函数内,只能给全局,函数传参需要的方式是

bash 复制代码
函数名 实参1 实参2 实参3 ····  (函数有参数的情况)
函数名  (没有参数)

而函数内部同样可以通过位置变量获取${n}

bash 复制代码
脚本的外部传参和函数的外部传参互不干扰:
如果在函数中使用位置变量获取到的就是函数的外部参数,
如果在脚本中使用位置变量获取到的就是脚本的外部参数,$0只能获取脚本名

当想获取函数中的返回值时,由于不像c中有类型,所以获取的方式也不一样,使用

bash 复制代码
$? 获取函数的返回值   ----->使用$?的上一条指令一定是函数的调用
$?的本质是获取到上一条指令的执行结果,

例如

bash 复制代码
#!/bin/bash
function fun()
{
	echo hello world
}
 
function add()
{
	echo $(($1+$2))
	echo $0
	a=258
	return $a   #返回值只能返回0-255之中的数
}
add 12 34 
var=$?   #使用$?接收函数的返回值
echo $var
echo $a

在调用传参之后,使用var接受上一条结束的返回值

而在返回值超过258时,使用全局也能进行传递(Bash 中的退出状态码(包括 return 语句的值)是 8 位无符号整数,所以它们会自动进行模 256 运算)

或者使用命令置换的方法

bash 复制代码
function add() {
  echo 258
}

result=$(add)
echo $result  # 这将输出 258

local声明局部变量

在局部使用将变量定义成局部变量

bash 复制代码
function add() 
{ 
 #echo $(($1+$2)) 
 #echo $0 
 a=258 
 local b=80   #被定义成了一个局部变量 
 echo $b 
 unset b     #unset是可以清空局部变量 
 echo $b 
 
 return $a   #返回值只能返回0-255之中的数 
} 
  1. 实现一个对数组求和的函数,数组通过实参传递给函数
bash 复制代码
#!/bin/bash

function array_sum() {
  local sum=0
  for num in "$@"; do
    sum=$((sum + num))
  done
  echo $sum
}


result=$(array_sum "$@")
echo "The sum of the array is: $result"

2.写一个函数,输出当前用户的uid和gid,并使用变量接收结果

bash 复制代码
#!/bin/bash
uid=0
gid=0

function id_func(){
uid=$(id | cut -d' ' -f1 | cut -d'=' -f2 | cut -d'(' -f1)
gid=$(id | cut -d' ' -f2 | cut -d'=' -f2 | cut -d'(' -f1)

}
id_func
echo "UID: $uid"
echo "GID: $gid"
相关推荐
qq_229058011 分钟前
Docker常用命令
linux·服务器·docker
春日见2 分钟前
Docker如何基于脚本拉取镜像,配置环境,尝试编译
运维·驱动开发·算法·docker·容器
Vect__3 分钟前
基于抢票系统的线程互斥详解
linux
是个西兰花6 分钟前
进程间通信:匿名管道
linux·运维·服务器
爱吃泡芙的小白白6 分钟前
使用Cursor来进行连接SSH远程主机中出现的问题(自用)
服务器·学习·ssh·cursor
小北方城市网8 分钟前
Spring Cloud Gateway 生产级微内核架构设计与可插拔过滤器开发
java·大数据·linux·运维·spring boot·redis·分布式
wacpguo8 分钟前
Ubuntu 24.04 安装 Docker
linux·ubuntu·docker
wan9zhixin13 分钟前
解密六氟化硫气体检测仪在运维现场的多元应用场景
运维
Lenyiin28 分钟前
Linux 进程控制
linux·运维·服务器
咕噜咕噜万37 分钟前
测试用例执行进度实时同步工具指南:从流程打通到效率提效的全链路落地
运维·网络