Linux/C 高级——shell脚本

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/bashI=0
#I=`expr $I + 1`
((++I ))
echo $Iread -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
		命令表1else
		命令表2fi

多路分支结构:

if 条件1
then
    命令表1
elif 条件2
then
    命令表2
fi

嵌套结构:

if 条件1
thenif 条件2then
        命令表1fi
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/bashread -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/bashi=1
SUM=0
while test $i -le 10
do#((SUM=SUM+i))#SUM=`expr $SUM + $i`let SUM=SUM+i((i++))
done
echo $SUMSUM=0
##################################
for ((i=1;i<=10;i++))
do((SUM=SUM+i))
done
echo $SUM

3.3.5 循环控制语句

break n: 结束n层循环

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

#!/bin/bashfor ((i=0;i<5;i++))
dofor((j=0;j<5;j++))doif [ $j -eq 3 ]then #break 1#break 2#continue 1continue 2fi echo "$i : $j"  #4 2done 
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/bashread -a arr
MIN=${arr[0]}
n=${#arr[@]}
for ((i=0;i<n;i++))
doif [ $MIN -gt ${arr[i]} ]thenMIN=${arr[i]}fi
done
echo $MIN

冒泡排序:

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

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

#!/bin/bashif [ -d aa ]    #如果当前目录下有aa目录就删除然后创建
thenrm -r aa 
fimkdir aanum=0
filelist=`ls`    #将当前目录下所有文件赋值给filelist变量
for file in $filelist  #for file in *  #用file遍历当前目录下所有文件
doif [ -f $file ]        #如果是普通文件就复制到aa目录下thencp $file ./aa        ((num++))            #计算文件个数fi
done
echo $num

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国信息学奥赛专用系统之----NOI Linux 2.0系统安装教程

1、下载NOI Linux 2.0系统&#xff0c;下载地址&#xff1a; https://noiresources.ccf.org.cn/ubuntu-noi-v2.0.iso 2、新建虚拟机 3、开机安装系统 下载插件&#xff0c;可能需要10分钟以上。 5、进系统看看 OK,NOI Linux 2.0系统安装完毕&#xff01;

【学习笔记】用线段树维护区间计数问题

前言 简单的区间计数问题可能直接推式子就行了。 但有些问题必须要数据结构维护。线段树就是一个比较好的处理区间的数据结构。 Gym102222L 思路 满足条件的区间特征&#xff1a; max ⁡ { a i } − min ⁡ { a i } 1 − c n t 0 \max\{a_i\}-\min\{a_i\}1-cnt0 max{ai​}…

解锁创意之门:如何使用DALL·E-3创作惊艳的图像

在这个视觉驱动的时代&#xff0c;图像已经成为表达创意和传递信息的重要媒介。最近&#xff0c;OpenAI发布了新一代的图像生成模型——DALLE-3&#xff0c;它以其卓越的生成能力和细致的图像质量迅速成为了创意工作者的热门工具。今天&#xff0c;我将带你一步步了解如何使用D…

13.3 正则表达式的应用

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

2024年6月scratch图形化编程等级考试三级真题

202406 青少年软件编程等级考试Scratch三级真题 试卷总分数&#xff1a;100分 考试时长&#xff1a;60 分钟 第 1 题 运行程序后&#xff0c;角色的x坐标是&#xff1f;&#xff08; &#xff09; A&#xff1a;99 B&#xff1a;100 C&#xff1a;199 D&#xff1a;200 正…

矩阵的导数运算

1. 标量方程对向量的导数 一维方程f(y)求极值即求导,令 二维方程f(y1,y2)求极值即求偏导,令 如果一个标量方程f(y1,y2,...ym)有m个自变量,求取它的极值就需要求取m组的方程组。当然可以用一种简洁的方式来表达它,比如二维方程f(y1,y2)可以把其中的变量写成向量的形式,此…

指针基础知识(笔记)

文章目录 1. 概念理解2. 空指针和野指针3. 计算4. 小结5. size_t6. 案例一: 指针查找并返回指定元素索引7. 指针访问多维数组(涉及 int (*ptr)[3]解析)8. 指针数组9. 函数的值传递与地址引用传递① 函数的值传递(pass by value)② 地址传递(pass by reference) 10. 案例二&…

C语言宠物系统

功能有增加宠物信息&#xff0c;显示宠物信息&#xff0c;删除宠物信息&#xff0c;修改功能和排序功能&#xff0c;可以选择姓名排序&#xff0c;年龄排序&#xff0c;价格排序。进阶的功能有文件操作&#xff0c;动态内存开辟。。 test.c源文件 #include "Pet.h"v…

机器人帮助文档

文章目录 机器交流使用群使用图例1. 查看机器人使用文档2. 直接问问题&#xff08;系统默认AI&#xff09;3. 系统默认AI切换4. 直接问问题&#xff08;指定讯飞星火AI&#xff09;5. 直接问问题&#xff08;指定百度文心AI&#xff09;6. 直接问问题&#xff08;指定谷歌AI&am…

代码随想录算法训练营Day34 | 62.不同路径 | 63. 不同路径 II | 343.整数拆分 | 96.不同的二叉搜索树

今日任务 62.不同路径 题目链接&#xff1a; https://leetcode.cn/problems/unique-paths/description/题目描述&#xff1a; Code class Solution { public:int uniquePaths(int m, int n) {// vector<vector<int>> memo(m, vector<int>(n, -1));// fu…

从0开始的1panel搭配雷池社区版保护网站

1.安装1panel 使用默认安装地址&#xff1a;/opt [1Panel Log]: 外网地址: http://xxxxx:35628/dc54fe6a54 [1Panel Log]: 内网地址: http://10.0.4.3:35628/dc54fe6a54 [1Panel Log]: 面板用户: root [1Panel Log]: 面板密码: xxxxx 安装完成第一次登陆 安装openresty&…

【原创】springboot+mysql法律咨询网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

初学51单片机1602液晶时序图实例分析

上篇博文笔者分享了关于液晶1602基本的工作流程&#xff0c;本篇主要是通过逻辑分析仪来看一下程序使能的电平时序&#xff0c;是否符合产品文档给出 的时序逻辑。 先看一下1602的时序图 认识下时序图中各个标识的含义&#xff1a; Tc信号周期&#xff08;E Cycle Time&#x…

【解压既玩】PS3模拟器v0.0.32+战神3+战神升天+各存档 整合包 ,完美不死机,没有BUG,旷世神作,强力推荐

战神3是圣莫尼卡公司的大作&#xff0c;PS3 上必玩的游戏之一。 本文收集了战神3和升天两作&#xff0c;附存档&#xff0c;完美不死机&#xff0c;没有BUG&#xff0c;强烈推荐。 解压即玩。 立即下载&#xff1a;【chumenx.com】【解压既玩】PS3模拟器v0.0.32战神3战神升天…

Docker数据管理,数据卷,容器服务器数据卷

一、容器的数据管理介绍 1.1 Docker容器分层 Docker镜像由多个只读层叠加而成&#xff0c;启动容器时&#xff0c;Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。 如果运行中的容器修改了现有的一个已经存在的文件&#xff0c;那该文件将会从读写层下面的只读层复制到…

Redis相关面试题(二)

一、Bit中不同命令使用的场景 二、什么是缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩&#xff1f; 缓存击穿&#xff1a;是指当某一个key的缓存过期时大并发量的请求同时访问key&#xff0c;瞬间击穿服务器直接访问到数据库&#xff0c;使得数据库处于负载情况 缓存穿透…

mysql8.4.2数据库做主从复制

linux rocky 9.2系统安装mysql-wsrep-8.4.2-26.20-linux-x86_64.tar.gz二进制包-CSDN博客文章浏览阅读472次&#xff0c;点赞7次&#xff0c;收藏4次。linux rocky 9.2系统安装mysql-wsrep-8.4.2-26.20-linux-x86_64.tar.gz二进制包https://blog.csdn.net/xikui1551/article/de…

C++的深拷贝和浅拷贝

浅拷贝是一种简单的拷贝方式&#xff0c;仅仅是复制对象的基本类型成员和指针成员的值&#xff0c;而不复制指针所指向的内存。这可能会导致两个对象共享相同的资源&#xff0c;从而引发潜在的问题&#xff0c;如内存泄漏、意外修改共享资源等。一般来说编译器默认帮我们实现的…

Openwrt配置ZeroTier,实现公网访问内网中服务器

ZeroTier注册&Openwrt初始配置 首先来到Openwrt的VPN→ZeroTier页面&#xff0c;进行一个很简单的注册 注册后去zerotier的网页管理页面进行一个很简单的创建网络 复制网络ID备用 在openwrt填写网络ID并启用。如果你需要访问内网主机勾上 自动客户端NAT 在zerotier网络管理…

十一、vector 类

Ⅰ . vector 的介绍和使用 01 vector 的介绍 vector 的文档介绍&#xff1a;vector ① vector 是表示可变大小数组的序列容器&#xff0c;既像数组&#xff0c;又不像数组 像体现在&#xff1a;同样采用连续存储空间存储元素&#xff0c;可以使用下标访问元素 不像体现在&…