Linux/C高级(精讲)----shell结构语句、shell数组

shell脚本

功能性语句

test

可测试对象三种:字符串 整数 文件属性

每种测试对象都有若干测试操作符

1)字符串的测试:

s1 = s2 测试两个字符串的内容是否完全一样

s1 != s2 测试两个字符串的内容是否有差异

-z s1 测试s1 字符串的长度是否为0

-n s1 测试s1 字符串的长度是否不为0

2)整数的测试:

a -eq b 测试a 与b 是否相等 equal

a -ne b 测试a 与b 是否不相等 not equal

a -gt b 测试a 是否大于b greater than

a -ge b 测试a 是否大于等于b greater equal

a -lt b 测试a 是否小于b litter than

a -le b 测试a 是否小于等于b litter equal

3)文件属性的测试:

-d name 测试name 是否为一个目录

-f name 测试name 是否为普通文件

-e name 测试文件是否存在

cs 复制代码
#!/bin/bash
#A=5
#A=`expr $A + 1`
#((A++))
# read -p "input:" a b c d
# SUM=`expr $a \* $b + $c - $d / $b`
# ((S=a*b+c-d/b))
# echo $SUM
# echo $S

#测试两个字符串的内容是否完全一样
VAR="nihao"
test $VAR = "hello"
echo $?

#测试两个字符串的内容是否有差异
VAR="nihao"
test $VAR != "hello"
echo $?

#测试字符串的长度是否为0
test -z $VAR
echo $?

#测试字符串的长度是否不为0
test -n $VAR
echo $?
#测试两个数是否相等
test 10 -eq 20
echo $?
#测试两个数是否不相等
test 10 -ne 20
echo $?
#测试a是否 > b
test 10 -gt 20
echo $?
#测试a是否 >= b
test 10 -ge 20
echo $?
#测试a是否 < b
test 10 -lt 20
echo $?
#测试a是否 <= b
test 10 -le 20 
echo $?

read -p "input:" F
#测试是否为一个目录
test -d $F
echo $?
#测试是否为普通文件
test -f $F
echo $?
#测试文件是否存在
test -e $F
echo $?

结构性语句

if语句

基本结构:

if 条件

then

命令表1

else

命令表2

fi

多路分支语句:

if 条件1

then

命令表1

elif 条件2

then

命令表2

fi

嵌套结构:

if 条件1

then

if 条件2

then

命令表1

fi

else

命令表2

fi

补充操作符:

-o 或运算 例如 $a -lt 20 -o $b -gt 100 返回 true

-a 与运算 例如 $a -lt 20 -a $b -gt 100 返回 false

! 非运算 例如 ! false 返回 true

&& 逻辑与 例如 \[ $a -lt 100 \&\& $b -gt 100 ] 返回 false

|| 逻辑或 例如 \[ $a -lt 100 \|\| $b -gt 100 ] 返回 true

| 位或 例如 echo $2\|2

&位与 例如 echo $2\&1

case语句

格式:

case 变量 in

模式1)

命令表1

;;

模式2)

命令表2

;;

*)

命令表n

;;

esac

练习:学生成绩管理系统,用shell中的case实现

90-100:A

80-89:B

70-79:C

60-69:D

<60:不及格

for循环

格式:

for 变量名 in 单词表

do

命令表

done

变量依次取单词表中的各个单词, 每取一次单词, 就执行一次循环体中的命令。循环次数由单词表中的单词数确定。命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。

for语句的几种书写格式:

1)for i in 1 2 3 4 do....done :

变量i从单词表中取值

2)for i do...done:

变量i从命令行取值,可以省略in单词表

3)for i in {1..10} do...done:

变量i从1-10个数中取值

4)for ((i = 0; i < 10; i++)) do...done:

书写格式类似c语言

while:

格式:

while 命令或表达式

do

命令表

done

while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。

练习:

分别用for和while实现1-10求和

循环控制语句

break n :结束n层循环

continue n: 结束n层的本次循环,继续下一次循环

数组

数组的赋值:

(1) arr=(1 2 3 4 5)

(2) arr=(1 2 $3...)

(3) readabc

arr=(a b $c)

(4) read -a arr

数组的调用:

${arri} #引用数组元素,数组元素下标从0开始到n-1结束

arri=10 #对数组元素重新赋值

${arr@} #遍历数组

${#arr@} #数组元素的个数

练习:

从终端输入3个整数,输出三个数中的最小值

冒泡排序:

选择排序:

函数

函数的定义方式

(1) 函数名()

{

命令表

}

(2) function 函数名()

{

命令表

}

函数的调用

函数名 参数列表

函数内 1 2 表示的是传递给函数的参数

作业:

用shell脚本试下以下功能:

判断当前路径下是否存在目录aa,如果不存在创建;遍历当前路径下的文件,如果是普通文件,将文件复制到aa目录下,并计算文件的个数。

相关推荐
南棱笑笑生2 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
名字还没想好☜2 小时前
用 systemd 托管后台服务:Restart 策略、日志接管、资源限制与开机自启全踩一遍
运维·docker·kubernetes
乌恩大侠3 小时前
GH200 新增 NVMe SSD 分区、格式化与挂载完整流程
运维·服务器·前端
tangwangbi3 小时前
Linux 系统配置文件:/etc/profile、~/.bashrc 和 ~/.bash_profile 三者之间的区别与作用
linux·运维·bash
蜀道山老天师4 小时前
Shell Bash变量与运算符(含条件测试与流程控制)
linux·运维·bash
Mr.朱鹏4 小时前
Linux 服务器 LVM 根分区在线动态扩容
linux·服务器·数据库
草邦设计开发团队_媒体资源平台4 小时前
GEO 信源整合一键发布软文:从内容生产到流量获客的自动化实践
运维·人工智能·自动化
zhou lily4 小时前
非标自动化管理系统ERP如何选?2026年10大ERP软件对比分析
运维·自动化
mengge.cloud4 小时前
存储技术基础小白教程
linux·运维·服务器·wpf·存储
云贝贝贝5 小时前
腾讯云 TDSQL(MySQL 版)运维高频 6 坑:代理路由、读写分离、分片键、监控、PITR
运维·mysql·腾讯云