当前位置: 首页 > article >正文

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 测试文件是否存在

#!/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

数组的调用:

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

arr[i]=10 #对数组元素重新赋值

${arr[@]} #遍历数组

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

练习:

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

冒泡排序:

选择排序:

函数

函数的定义方式

(1) 函数名()

{

命令表

}

(2) function 函数名()

{

命令表

}

函数的调用

函数名 参数列表

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

作业:

用shell脚本试下以下功能:

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


http://www.kler.cn/a/534714.html

相关文章:

  • 何为运行时(Runtime)
  • 【Rust自学】20.2. 最后的项目:多线程Web服务器
  • DeepSeek模型实战:从理论到应用的深度探索
  • springboot+vue+uniapp的校园二手交易小程序
  • 【电脑系统】电脑突然(蓝屏)卡死发出刺耳声音
  • 【PyQt】pyqt小案例实现简易文本编辑器
  • element-plus+vue3前端如何根据name进行搜索查到符合条件的数据
  • async-http-client使用示例
  • Linux网络 | 理解NATPT, 数据链路层Done
  • 如何查看 MySQL 是否处于运行状态
  • 开放式TCP/IP通信
  • Android 自定义View的详解
  • html转PDF文件最完美的方案(wkhtmltopdf)
  • 【机器学习】训练(Training)、验证(Validation)和测试(Testing)
  • Linux内核链表
  • 从0开始达芬奇(3.8)
  • 【Spring Boot】解锁高效安全之门:登录令牌技术的实战应用与价值解析
  • Oracle 变更redo log文件位置
  • Java 大视界 -- Java 大数据在智能教育中的应用与个性化学习(75)
  • 【重生之学习C语言----杨辉三角篇】
  • AWS Copilot
  • 威联通NAS桌面图标消失后恢复术
  • k8s部署rabbitmq
  • PCL 最小包围圆(二维)
  • IEEE 802.3/802.2 | LLC / SNAP
  • 配置Apache本地服务支持PHP8--易错点