Linux 学习记录38(C高级篇)

本文详细介绍了Linuxshell脚本中的高级概念,包括case...in语句和通配符的使用,while和for循环的结构以及select...in语句。同时,还讲解了shell函数的定义、调用及返回值处理,并提到了local关键字的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux 学习记录38(C高级篇)

在这里插入图片描述

一、shell中的分支语句

1. case…in语句

格式:case $变量名 in 表示开始
表达式1)
代码块
;; 相当于C语言中的break 且不能省略

*) 相当于default,*表示通配所有情况
代码块
;; 相当于C语言中的break 且不能省略,只有在最后一个分支才能省略

esac 表示结束

*)的位置会影响case in 语句的执行效果

#!/bin/bash
case "$val" in
	表达式1)
		shell语句
		;; #break;
	表达式2)
		shell语句
		;; #break;
	*) #相当于
		shell语句
		;; #break;
esac
=================================
#!/bin/bash
read val
case "$val" in
	10)
		echo "10"
		;; #break;
	20)
		echo "20"
		;; #break;
	*)
		echo "*"
		;; #break;
esac

2. shell中的通配符

* :通配一个或多个字符
? :通配一个字符
[] :通配[]内的一个字符
例:输入年和月份,判断该月有多少天,考虑润,平年
read -p "请输入year: " year
read -p "请输入month: " month
echo "--------------------"

case "$month" in
	1|3|5|7|8|10|12)
		echo "day: 31"
		;; #break;
	4|6|9|11)
		echo "day: 31"
		;; #break;
	2)
		if [ $(($year%4)) -eq 0 -a $(($year%100)) -ne 0 -o $(($year%400)) -eq 0 ]
		then
			echo "day: 28"
		else
			echo "day: 29"
		fi
		;; #break;
	*) echo "error"
esac
判断输入的1个字符是数字,小写字母,大写字母和其他符号
#!/bin/bash
read -p "请输入1个字符: " -n 1 ch

case "$ch" in
	[0-9])
		echo "是数字"
	;;

	[[:upper:]])
		echo "是小写字母"
	;;

	[[:lower:]])
		echo "是大写字母"
	;;

	*)
		echo "是其他符号"
	;;

esac

二、shell中的循环结构

在shell中 [][[]]是有区别的
	1. [] 是test指令
	2. [[]] 只能被一些shell解析器识别
	3. []内使用逻辑与和逻辑或,需要使用-a和-o参数,[[]]内可以直接使用||&&
	4. []内如果不加"" 可能不能正确识别字符串范围,[[]]可以正确识别

1. while循环

格式:

while [ 表达式 ] ---------> while test 
do
	表达式成立执行的代码块
done
===========================================
#!/bin/bash
i=1
while [ $i -le 5 ]; do

	echo "hello world"
	((i++))
done

2. shell中的printf

printf "%d %d %d" $val1 $val1 $val1

3. for循环

(1. 类似C中的格式

for((表达式1;条件;表达式2))
do
done
===========================
#!/bin/bash
for((i=0;$i<5;((i++))))
do
 echo "hello world"
done

(2. shell中的格式

执行逻辑:

字符串列表在的是变量可能出现的所有情况,for循环执行的次数和字符串的个数有关,变量要顺序遍历结果字符串列表中的每一种情况,for循环才结束

for 变量名 in 字符串列表
do
代码块
done
=====================
for i in 1 2 3 4 5
do
 echo "hello world"
done

(3. 连续列表

=用以输出连续的序列=

指令
seq 1 2 100
1-起始值 可省略
2-间隔值 可省略
输出:以1开始2为间隔,到100的数
=============================
{1..100}
间隔固定为1,且只能用在for循环中in的后面
=============================
#!/bin/bash
for i in `seq 1 1 5`
do
 echo "hello world"
done
=============================
#!/bin/bash
for i in {1..5}
do
 echo "hello world"
done

4. select …in 语句

格式

select 变量名 in 选项列表
do
	循环体
done

例:

#!/bin/bash
select i in a b c d e f
do
echo $i
done

运行效果:
在这里插入图片描述
执行逻辑:

  1. select·.·in语句会列出选项列表,#?提示用户选择,如果用户不选择,再提示一次选项列表
  2. 选择时,选的是编号不是具体的内容

通常和case...in结合使用

例:

#!/bin/bash
select i in linux wins unix
do
    case $i in 
        linux)
            echo "打开的是ubuntu系统"
            ;;
        wins)
            echo "打开的是wins系统"
            ;;
        unix)
            echo "打开的是unix系统"
    esac
done

5. 辅助控制关键字

break/continue

(1. break

break n #跳出n层循环

(2. continue

continue n #跳出n层循环本次循环

三、shell中的函数

1. 格式

格式:

function 函数名()
{
	函数体
	return 返回值
}

注意事项

  1. 函数头,没有返回值类型也没有形参列表
  2. 函数是否有返回值,根据函数具体实现来决定
  3. 函数是否有参数,根据调用时是否传参决定,函数头中的()内不能放任何内容
  4. function 可以加也可以不加
  5. shell中 函数的声明和定义不能分开

2. 调用/获取参数

调用:
函数名 参数1 参数2 参数3
函数结束参数和外部传参结束是一样的

#!/bin/bash
function fun()
{
	echo "$*"
}
fun 1 2 3 4 5 6

效果:
在这里插入图片描述

3. 接收返回值

  1. 使用命令置换符接收
    函数必须要有输出才能接收
#!/bin/bash
function fun()
{
	sum=$(($1+$2))
	echo $sum
}
ret=`fun 1 2 3 4 5 6`
echo $ret
  1. 使用$?接收
#!/bin/bash
function fun()
{
	sum=$(($1+$2))
	return $sum
}
fun 1 2 3 4 5 6
ret=$? #$?用于接收上一条指令的结果
echo $ret

4. 函数内使用local关键字

function fun()
{
	local sum=$(($1+$2))
	unset sum #清空局部变量
	return $sum
}

思维导图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值