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

LinuxC高级

shell中的语句

功能性语句

  1. test

test 语句可以测试三种对象:

字符串 整数 文件属性

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

3.1. 字符串测试

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

test "hello" = "world"
echo $?        # 1 相等为真,不想等为假

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

test "hello" != "world"
echo $?        # 0 相等为假,不相等为真

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

test -z ""
echo $?        # 0 字符串没有长度,则为真
test -z "hello"
echo $?        # 1 字符串有长度,则为假

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

test -n ""
echo $?        # 1 字符串没有长度,则为
test -n "hello"
echo $?        # 0 字符串有长度,则为

3.2. 整数的测试:

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

read A B
test $A -eq $B
echo $?        # 如果两个数相等则为真,反之为假

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

read A B
test $A -ne $B
echo $?        # 如果两个数不相等则为真,反之为假

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

read A B
test $A -gt $B
echo $?        # 如果a大于b则为真,反之为假

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

read A B
test $A -ge $B
echo $?        # 如果a大于等于b则为真,反之为假

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

read A B
test $A -lt $B
echo $?        # 如果a于b则为真,反之为假

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

read A B
test $A -le $B
echo $?        # 如果a小于等于b则为真,反之为假

3.3. 文件属性

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

read FILE
test -d $FILE
echo $?        # 如果name是目录则为真,反之为假

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

read FILE
test -f $FILE
echo $?        # 如果name是普通文件则为真,反之为假

-e name 测试name是否存在

read FILE
test -e $FILE
echo $?        # 如果文件或目录存在则为真,反之为假

补充:

FILE1 -nt FILE2:1的时间戳比2的更新
FILE1 -ot FILE2:1的时间戳比2的更旧
-b FILE:文件存在且是一个块设备文件
-c FILE:文件存在且是一个字符设备文件
-d FILE:文件存在且是一个目录设备文件
-f FILE:文件存在且是一个普通文件
-e FILE:文件存在
-h 或者 -L FILE:文件存在且为软链接文件
-s FILE:文件存在且大小不为0
-S FILE:文件存在且是一个套接字文件
-p FILE:文件存在且是一个管道文件
-w FILE:文件存在且有可写权限
-r FILE:文件存在且有可读权限
-x FILE:文件存在且有可执行权限

结构性语句

if .. then .. fi

  1. 基本结构

if 表达式
then
    命令表
fi

  1. 分层结构

if 表达式
then
    命令表1
else
    命令表2
fi

  1. 嵌套结构

if 表达式
then
    if 表达式
    then
        命令表
    fi
else
    命令表
fi

可以使用 [] test省略[]本质上是一个test命令

  1. elif

if 表达式1
then
    命令表1
elif 表达式2
then
    命令表2
...
else
    命令表n
fi

case语句

case 变量 in
模式1)
    命令1
    ;;
模式2)
    命令表2
    ;;
...
*)
    命令表n
    ;;
esac

工作方式:
    取值后面必须为关键字 in ,每一个模式必须以右括号结束。
    取值可以为变量或者常量,取值检测匹配的每一个模式
    一旦模式匹配,其间所有命令开始执行直至 ;;
    执行完匹配模式相应的命令不会再继续匹配其他的模式
    如果无一匹配模式,使用 * 号捕获该值

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

90-100:A

80-89:B

70-79:C

60-69:D

<60:不及格

for循环

for 变量名 in 单词表
do
    命令表
done

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

示例

#!/bin/bash

for I in 1 2 3 4 5
do
    echo $I
done

for语句几种书写格式
  1. for i in 1 2 3 4 do ... done

变量i单词表中取值

  1. for i do ... done

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

  1. for in {1..10} do ... done

变量i1-10中依次取值

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

书写格式类似于C语言

可以取到当前目录下所有文件或者目录

练习:

1、终端输入行数,打印直角三角形

*

**

***

·····

while循环

while 命令表达式
do
    命令表
done

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

循环控制语句

break n 结束n循环

continue n :跳过n本次循环

#!/bin/bash

for (( i = 1; i <= 5; i++ ))
do
    for (( j = 1; j <= 5; j++ ))
    do
        if [ $j -eq 3 ]
        then 
            # break 1
            # break 2
            # continue 1
            continue 2
        fi
        echo "$i:$j"
    done
done


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

相关文章:

  • C++标准模板库 -- map和set
  • 图像处理 之 凸包和最小外围轮廓生成
  • 解决vue-pdf的签章不显示问题
  • 中间件--laravel进阶篇
  • 笔记记录 k8s-RBAC
  • 用java和redis实现考试成绩排行榜
  • 零差云控 ZeroErr eRob 电机 CAN、CANopen、EtherCAT、ROS2 机器人开发详细教程
  • 网络安全之接入控制
  • 机器人运动控制与编程:从轮式机器人到步行机器人的全景探索
  • 更改ArduSub水平位置控制器为ADRC
  • 数字排列.
  • MAC借助终端上传jar包到云服务器
  • 【天壤智能-注册安全分析报告-无验证纯IP限制存在误拦截隐患】
  • 2024年亚太地区数学建模竞赛(亚太杯)C题保姆级教程思路分析
  • I.MX6U 裸机开发18.GPT定时器实现高精度延时
  • SQL注入的那些面试题总结
  • 计算机软硬件体系结构
  • vim 一次注释多行 的几种方法
  • RK356x-9:根文件系统复制和打包
  • 39页PDF | 毕马威_数据资产运营白皮书(限免下载)
  • 如何默认VS2019用管理员方式打开
  • 人工智能之机器学习(初步应用部分)数据集、特征工程
  • 量子感知机
  • mc minioclient同步
  • 网络安全审计概述与分类
  • c高级学习笔记