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"
相关推荐
群联云防护小杜13 分钟前
服务器被挂马怎么办?——解决服务器被挂马的方法和步骤
运维·服务器·网络协议·tcp/ip·安全·ddos
明志致远淡泊宁静18 分钟前
记录一次服务器redis被入侵
运维·服务器·redis
Jtti18 分钟前
Jtti:服务器总是自动重启怎么办?
运维·服务器
我是黄大仙20 分钟前
利用飞书多维表格自动发布版本
运维·服务器·数据库·飞书
7yewh28 分钟前
嵌入式硬件实战提升篇(一)-泰山派RK3566制作多功能小手机
linux·arm开发·驱动开发·嵌入式硬件·物联网·智能手机·硬件架构
YRr YRr1 小时前
ubuntu ros 解决建完图后 保存的地图非常小的问题
linux·运维·ubuntu
汤米粥1 小时前
怎么样绑定域名到AWS(亚马逊云)服务器
服务器·云计算·aws
脸ル粉嘟嘟1 小时前
常用命令之Linux&Oracle&Hive&Python
linux·hive·oracle
Wils0nEdwards1 小时前
Leetcode 整数转罗马数字
linux·python·leetcode