Linux 学习记录38(C高级篇)
本文目录
- Linux 学习记录38(C高级篇)
- 一、shell中的分支语句
- 1. case...in语句
- 2. shell中的通配符
- 二、shell中的循环结构
- 1. while循环
- 2. shell中的printf
- 3. for循环
- (1. 类似C中的格式
- (2. shell中的格式
- (3. 连续列表
- 4. select ...in 语句
- 5. 辅助控制关键字
- (1. break
- (2. continue
- 三、shell中的函数
- 1. 格式
- 2. 调用/获取参数
- 3. 接收返回值
- 4. 函数内使用local关键字
- 思维导图
一、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
运行效果:
执行逻辑:
- select·.·in语句会列出选项列表,#?提示用户选择,如果用户不选择,再提示一次选项列表
- 选择时,选的是编号不是具体的内容
通常和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 返回值 }
注意事项
- 函数头,没有返回值类型也没有形参列表
- 函数是否有返回值,根据函数具体实现来决定
- 函数是否有参数,根据调用时是否传参决定,函数头中的()内不能放任何内容
- function 可以加也可以不加
- shell中 函数的声明和定义不能分开
2. 调用/获取参数
调用:
函数名 参数1 参数2 参数3
函数结束参数和外部传参结束是一样的
#!/bin/bash function fun() { echo "$*" } fun 1 2 3 4 5 6
效果:
3. 接收返回值
- 使用命令置换符接收
函数必须要有输出才能接收
#!/bin/bash function fun() { sum=$(($1+$2)) echo $sum } ret=`fun 1 2 3 4 5 6` echo $ret
- 使用$?接收
#!/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
}