Linux/C 高级——shell脚本

news2024/9/28 19:21:12

1. shell脚本基础概念

1.1概念

shell使用方式:手动下命令和脚本

脚本本质是一个文件,文件里面存放的是特定格式的指令,系统可以使用脚本解析器翻译或解析指令并执行(它不需要编译)。

shell脚本本质:shell命令的有序集合,扩展名可以为sh见名知意,也可以没有。

shell 既是应用程序,又是一种脚本语言(应用程序 解析 脚本语言)。

编译型语句:编译器gcc, g++

解释型语句:不需要编译,解释一条执行一条,python、shell脚本。

1.2创建和执行

新建一个shell脚本: touch xx.sh

第一行为: #!/bin/bash

意思是使用/bin/bash来解释执行

执行方式:

  1. sudo chmod 权限 xx.sh #使脚本具有执行权限
  2. ./xx.sh #执行脚本

练习:

1)在当前路径下创建file_1到file_5, 5个普通文件

2)删除 file_2和file_3文件(使用通配符)

3)将剩下的file文件用tar压缩成bz2的格式

4)将压缩文件复制到家目录下

5)进入到家目录解压压缩文件

6)删除压缩包

2.变量

2.1用户自定义变量

名命一般用大写

进行赋值时用=,左右两边不能有空格

引用变量在变量名前面加$

2.2位置变量

$0或者${0}代表包含脚本文件名的命令行参数./xx.sh

$1,$2...代表第二个命令行参数、第三个命令行参数以此类推

$# 代表命令行参数个数(不包含第一个也就是带脚本名的命令行参数)

$@或者$* 代表所有命令行参数(不包含第一个也就是带脚本名的命令行参数)

2.3预定义变量

$? 代表前一个命令的退出状态(0为真,非0为假)

$$ 代表执行进程的ID号

2.4环境变量

变量没有类型,都看作是字符串。

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。

HOME: /etc/passwd文件中列出的用户主目录

PATH :shell搜索路径,就是是一系列目录,当执行命令时,linux就在这些目录下查找。

3.功能语句

3.1说明性语句

以#开头

注释用#

3.2功能性语句

3.2.1 read

功能:read从标准输入读入一行,并赋值给后面的变量

格式:read 变量列表

把读入行中的第一个单词赋值给第一个变量,第二个单词赋值给第二个变量以此类推

read -p "提示语句" 变量列表: 可以将提示语句输出,同时输入变量

3.2.2 expr

expr 表达式

注意:表达式符号之间必须有空格,元素引用用$

可以直接输出结果,不过脚本里一般结合命令置换符把结果重新赋值给其他变量

算术运算符命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和取余数(%)等操作。注意小圆括号()前面也要加转义符\。

例子:

练习1:通过expr实现变量自加运算(++i)

练习2:计算表达式值a*b+c-d/b,a=2,b=3,c=15,d=18

要求:

1)从终端读入4个数a,b,c,d

2)进行运算

3)打印结果输出到终端

#!/bin/bash

I=0
#I=`expr $I + 1`
((++I ))
echo $I

read -p "input: " a b c d
#NUM=`expr $a \* $b + $c - $d / $b`
((NUM=a*b+c-d/b))
#NUM=$((a*b+c-d/b))
echo $NUM

也可以用(())进行数学运算

3.2.3 let

let 表达式

3.2.4 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

#测试字符串
VAR="hello"
test $VAR = "hello"
echo $?

test $VAR != "hello"
echo $?

test -z $VAR
echo $?

test -n $VAR
echo $?

#测试整数
test 10 -eq 5
echo $?

test 10 -ne 5
echo $?

test 10 -gt 5
echo $?

test 10 -lt 5
echo $?

#测试文件属性
read -p "input filename: " FILE
test -e $FILE
echo $?

test -f $FILE
echo $?

test -d $FILE 
echo $?

3.3结构性语句

3.3.1 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]

3.3.2 case语句

格式:

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

例子:

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

90-100:A

80-89:B

70-79:C

60-69:D

<60:不及格

#!/bin/bash

read -p "input score: " SCORE
case $SCORE in
100|9[0-9])
    echo "A"
    ;;
8[0-9])
    echo "B"
    ;;
7[0-9])
    echo "C"
    ;;
6[0-9])
    echo "D"
    ;;
[0-9]|[1-5][0-9])
    echo "lost"
    ;;
*)
    echo "input err"
    ;;
esac

3.3.3 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语言

3.3.4 while

格式

while 命令或表达式
do
    命令表
done

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

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

#!/bin/bash

i=1
SUM=0
while test $i -le 10
do
    #((SUM=SUM+i))
    #SUM=`expr $SUM + $i`
    let SUM=SUM+i
    ((i++))
done
echo $SUM

SUM=0
##################################
for ((i=1;i<=10;i++))
do
    ((SUM=SUM+i))
done
echo $SUM

3.3.5 循环控制语句

break n: 结束n层循环

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

#!/bin/bash

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

4.数组

4.1数组的赋值

a. 直接对数组赋值:

        arr=(1 2 3 4 5)

b. 把命令行参数赋值给数组:

        arr=($1 $2 $3)

c. 把元素赋值给数组:

        read a b c

        arr=($a $b $c)

d. 给数组元素输入赋值:

        read -a arr

4.2数组的调用

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

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

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

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

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

#!/bin/bash

read -a arr
MIN=${arr[0]}
n=${#arr[@]}
for ((i=0;i<n;i++))
do
    if [ $MIN -gt ${arr[i]} ]
    then
        MIN=${arr[i]}
    fi
done
echo $MIN

冒泡排序:

练习:用shell脚本试下以下功能:

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

#!/bin/bash

if [ -d aa ]    #如果当前目录下有aa目录就删除然后创建
then
    rm -r aa 
fi

mkdir aa

num=0
filelist=`ls`    #将当前目录下所有文件赋值给filelist变量
for file in $filelist  #for file in *  #用file遍历当前目录下所有文件
do
    if [ -f $file ]        #如果是普通文件就复制到aa目录下
    then
        cp $file ./aa        
        ((num++))            #计算文件个数
    fi
done
echo $num

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1992159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈 Spring AOP框架 (2)——Spring统一功能处理

文章目录 一、AOP实战——SpringBoot统一功能处理1.1、使用拦截器实现用户登录权限的统一验证1.1.1、使用原生Spring AOP实现统一拦截的难点1.1.2、Spring 拦截器1.1.2.1、Spring拦截器 使用步骤1.1.2.2、拦截器实现原理 1.2、统一数据格式返回1.2.1、为什么要返回统一的数据格…

Linux/C 高级——条件编译

1.根据宏是否定义 #define 宏名 #ifdef 宏名 /*code1*/ #else /*code2*/ #endif 执行顺序&#xff1a;宏名如果定义则编译code1&#xff0c;否则编译code2 例子&#xff1a; 2.根据宏值 #define 宏名 值 #if 宏名 /*code1*/ #else /*code2*/ #endif 执行顺序&#xff1a;宏的值…

真值表编程

打开真值表进行编辑 在图表中创建并标记真值表后&#xff0c;您可以指定其逻辑行为。要打开真值表&#xff0c;请双击真值表函数。 默认情况下&#xff0c;真值表包含一个条件表和一个动作表&#xff0c;每个表都有一行。条件表包含一个决策列D1和一个动作行。 选择动作语言 …

达梦数据库 数据类型

达梦数据类型 1.背景2.要求3.描述与使用3.1 常规数据类型3.1.1 字符数据类型3.1.1.1 CHAR类型3.1.1.2 CHARACTER类型3.1.1.3 VARCHAR类型 3.1.2 数值数据类型3.1.2.1 NUMERIC类型3.1.2.2 DECIMAL类型3.1.2.3 DEC类型3.1.2.4 NUMBER类型3.1.2.5 INTEGER类型3.1.2.6 INT类型3.1.2…

VC++_opencv插件ImageWatch的安装和使用

1、插件安装 以VS2015为例&#xff1a; 进入扩展和更新界面&#xff0c;点“联机”&#xff0c;然后输入“ImageWatch”进行搜索&#xff1a; 2、安装完毕后重启VisualStudio 如下图在菜单“视图\其他窗口”找到“ImageWatch”这个栏目 然后点开&#xff1a; 也可让其停靠在Vi…

c++----初识模板

大家好&#xff0c;这篇博客想与大家分享一些我们c中比较好用的知识点。模板。首先咧&#xff0c;我们都知道模板嘛&#xff0c;就是以前人的经验总结出来的知识。方便我们使用。这里的模板也是一样的。当我们学习过后&#xff0c;对于一些在c中的自定义函数&#xff0c;我们在…

QList 的访问方式list.at(index) 和 list[index] 对比

QList 是 Qt 框架中提供的一个模板容器类&#xff0c;用于存储和操作一系列元素。它提供了两种不同的方式来访问容器中的元素&#xff1a;.at()成员函数和下标运算符 []。以下是这两种方式的区别&#xff1a; 1. QList::at() 方法 at()是一个成员函数&#xff0c;它允许通过索…

04--Docker

前言&#xff1a;前面写过关于DockerKubernetes的部署&#xff0c;主要是针对国产化linux系统的适配问题&#xff0c;并没有对docker进行复习。这里整理一下docker的知识点&#xff0c;用作容器化微服务的起点&#xff0c;主要为日常工作配置使用&#xff0c;本章可能有点长&am…

详解Xilinx FPGA高速串行收发器GTX/GTP(4)--TX/RX接口的数据位宽和时钟设计

目录 1、时钟设计 2、TX接口 3、接口位宽与时钟的关系 4、时钟来源方案 5、TX端内部的时钟分频设计 6、RX接口 文章总目录点这里:《FPGA接口与协议》专栏的说明与导航 1、时钟设计 GT收发器内部比较复杂,所使用的时钟就不止一个,比较主要的时钟有两个,架构…

做好网络安全风险管理必备的5种能力

网络安全风险管理和网络安全防护是两个密切相关但不可互换的概念&#xff0c;网络安全防护侧重于应对攻击和响应正在发生的安全事件&#xff0c;而网络安全风险管理则强调从更全面的视角去评估企业的安全状况和面临的威胁态势&#xff0c;包括了从对组织运营、商誉、财务和合规…

值得注意!家里有带毛发动物就有浮毛?宠物空气净化器一键净化

上次跟朋友逛完街去她家&#xff0c;她家热情的哈基米开门就一个猛冲&#xff0c;我朋友接住就是一顿猛亲&#xff0c;亲猫一时爽&#xff0c;汗液粘着猫毛&#xff0c;粘得满手臂、满脸都是&#xff0c;看得鼻炎星人头皮发麻...好多养宠物的都说&#xff0c;梳毛根本不管用&am…

关于let 、const和Object.freeze的使用记录

let和const的使用差异 let对象变量&#xff0c;可以修改对象属性&#xff0c;可以给变量重新赋值 const对象变量&#xff0c;可以修改对象属性&#xff0c;不可以给变量重新赋值 Object.freeze()返回一个不可变对象&#xff0c;需要接收返回值。不会改变原参数的性质

LVS详解及其NAT模式与DR模式部署(全网最详细!!!)

文章目录 LVS集群概念集群和分布式 LVS运行原理LVS简介LVS专业术语工作原理LVS调度算法ipvsadm常用命令 LVS工作模式及其原理NAT模式DR模式TUN模式fullnet模式 部署NAT模式集群案例DR模式&#xff08;企业中最常用&#xff09;LVS持久链接&#xff08;session回话问题解决&…

SimpleITK C++版在windows 下编译

一般都是用python 版的SimpleITK&#xff0c;因为项目需要集成到C Qt上&#xff0c;然后ITK用起来又不如SimpleITK方便&#xff0c;所有就编译了C版的Sitk,下面记录下过程。 版本对应 SimpleITK 编译需要ITK ,而且不同版本需要对应不同的ITK&#xff0c;sitk 2.2.1 对应ITK 5…

基于Hadoop的海量电商用户行为分析及机器学习购买预测研究【购物行为分析、100万条数据案例项目】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主引言研究背景国内外研究现状研究目的研究意义 关键技术理论介绍Hadoop集群搭建及数据准备Hadoop全套组件搭建数据集介绍数据预处理 基于大数据的电商用户行为指标分析HIve准备数据表flume配…

在哪些行业中,3D 技术发挥了重要作用?

3D技术目前常见于行业或领域中的应用&#xff0c;主要包括3D数字孪生、3D打印等。3D数字孪生技术作为一种前沿技术&#xff0c;在多个行业中发挥着重要作用&#xff0c;它通过创建物理实体的数字化副本&#xff0c;实现对实体的实时监控、预测和优化。以下是一些3D数字孪生技术…

【总结】TCP/IP四层模型的理解

在开始之前放上一张本文章的核心图片&#xff0c;要一直记住图中的内容&#xff01;&#xff01;&#xff01; 一、概念理解 首先我们知道分析网络的时候有两种模型&#xff0c;一种是OSI七层模型&#xff0c;另一种就是TCP/IP四层模型。一般来说&#xff0c;我们常用的就是TC…

医疗工厂网络同步时钟,子母钟系统结构,可使用十年以上

在医疗和工业领域&#xff0c;准确的时间信息对于确保各项工作的高效运行至关重要。网络同步时钟系统因其高精度、易维护等特点&#xff0c;成为现代医疗工厂不可或缺的时间管理工具。本文将详细介绍网络同步时钟系统的优点及其技术细节。 一、网络同步时钟优点 网络同步时钟系…

工业设计用什么CAD软件?SolidWorks 成为您创意实现的得力助手

随着科技的发展&#xff0c;工业设计已经进入了数字化时代。对于设计师来说&#xff0c;选择一款高效、功能全面的设计软件至关重要。在市场上众多的CAD&#xff08;计算机辅助设计&#xff09;软件中&#xff0c;SolidWorks因其出色的性能和广泛的适用性而备受青睐。本文将介绍…

各地区搭子群扩列群h5公众号小程序app开源版开发

各地区搭子群扩列群多开h5公众号小程序app开源版开发 多端应用&#xff0c;源码开源支持自主二开&#xff1b;域名授权。 搭子群和扩列群通常是用来帮助人们找到志同道合的朋友或活动伙伴的社交平台。这些平台可以采用H5页面、微信公众号、小程序或独立的应用程序等形式。下面…