最全Linux环境开发——shell编程

Linux下shell编程

一、什么是shell

shell是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁Shell 既是一种命令语言,又是一种程序设计语言

shell 本质上是 linux 命令,一条一条命令组合在一起,实现某一个目的,就变成了shell脚本。它从一定程度上 减轻了工作量,提高了工作效率。简单来说Shell就是一个用户跟操作系统之间的一个命令解释器

在这里插入图片描述

  • 最常用的shell是Bash,也就是Bourne Again Shell。Bash由于易用和免费,在日常工作中被广泛使用,也是大多数Linux操作系统默认的Shell环境。

二、shell 基础

shell 编写规范

#!/bin/bash				[指定告知系统当前这个脚本要使用的shell解释器]
Shell相关指令

文件命名规范:

文件名.sh .sh是linux下bash shell 的默认后缀

shell 的执行

hello.sh 文件

#! /bin/bash
echo hello world
  1. 输入脚本的绝对路径或相对路径
    执行的必须是一个可执行文件

    songwei@songwei-virtual-machine:~/shell_test$ ./hello.sh 
    hello world
    
  2. bash或sh +脚本
    当脚本没有x权限时,root和文件所有者通过该方式可以正常执行

    songwei@songwei-virtual-machine:~/shell_test$ sh hello.sh 
    hello world
    songwei@songwei-virtual-machine:~/shell_test$ bash hello.sh 
    hello world
    
  3. source
    第一种和第二种会新开一个bash,不同bash中的变量无法共享。
    第三种 是在同一个shell里面执行的

    songwei@songwei-virtual-machine:~/shell_test$ source hello.sh 
    hello world
    

Bash 常用快捷键

在这里插入图片描述

输出输入重定向

输入重定向:是指不使用系统提供的标准输入端口,而进行重新的指定。换言之,输入重定向就是不使用标准输入端口输入文件,而是使用指定的文件作为标准输入设备。(重定向简单理解就是使用 “<”符来修改标准输入设备)
在这里插入图片描述
输出重定向:(通俗的讲,重定向输出就是把要输出的文件信息写入到一个文件中去,而不是将要输出的文件信息输出到控制台(显示屏),在linux中,默认的标准输出设备是控制台(或称为显示器),用户输出的信息默认情况下都会显示到控制台

在这里插入图片描述

三、shell变量

定义变量规则:

  1. 定义变量时,变量名不加美元符号
  2. 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  3. 中间不能有空格,可以使用下划线(_)。
  4. 不能使用标点符号。
  5. 不能使用bash里的关键字(可用help命令查看保留关键字)
# 定义变量
songwei@songwei-virtual-machine:~/shell_test$ name=songwei
# 调用变量
songwei@songwei-virtual-machine:~/shell_test$ echo $name
songwei
songwei@songwei-virtual-machine:~/shell_test$ echo ${name}
songwei
# 删除变量
songwei@songwei-virtual-machine:~/shell_test$ unset name
songwei@songwei-virtual-machine:~/shell_test$ echo ${name}


四、shell入门

shell字符串

  • 单引号
    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单独一个的单引号,但可成对出现,作为字符串拼接使用。
  • 双引号
    • 双引号里可以有变量
    • 双引号里可以出现转义字符

测试hello.sh

#! /bin/bash
name=songwei4615
str1="test1"
str2='test2'
echo "name=$name"
# 双引号
echo "hello1 ,$name !"
echo "hello2 ,${name} !"
# 单引号
echo 'hello3 ,$name !'
echo 'hello4 ,${name} !'
# 字符串长度
echo ${#name}

测试结果

songwei@songwei-virtual-machine:~/shell_test$ ./hello.sh 
name=songwei4615
hello1 ,songwei4615 !
hello2 ,songwei4615 !
hello3 ,$name !
hello4 ,${name} !
11

shell 数组

  • bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
  • 数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
    测试vector.sh
#! /bin/bash
nums=("Aa" "Bb" "Cc" "Dd")

echo "nums[0] = ${nums[0]}"
echo "nums[1] = ${nums[1]}"
echo "nums[2] = ${nums[2]}"
echo "nums[3] = ${nums[3]}"

echo "nums all date ${nums[@]}"

echo "nums lenght = ${#nums[@]}"
echo "nums lenght = ${#nums[*]}"

测试结果

songwei@songwei-virtual-machine:~/shell_test$ ./vecter.sh 
nums[0] = Aa
nums[1] = Bb
nums[2] = Cc
nums[3] = Dd
nums all date Aa Bb Cc Dd
nums lenght = 4
nums lenght = 4

shell 注释

  • 以 # 开头的行就是注释,会被解释器忽略。
  • 多行注释,:<<EOF
#--------------------------------------------
# 这是一个注释
# author:
# site:
#--------------------------------------------

# 特殊的多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF

shell 参数传递

  • 执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字
    在这里插入图片描述

测试arg.sh

#!/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
echo "传递的参数个数为:$#";
echo "显示所以参数为:$*";
echo "显示最后命令的退出状态为:$?";

测试结果

songwei@songwei-virtual-machine:~/shell_test$ ./arg.sh Aa Bb Cc 
Shell 传递参数实例!
执行的文件名:./arg.sh
第一个参数为:Aa
第二个参数为:Bb
第三个参数为:Cc
传递的参数个数为:3
显示所以参数为:Aa Bb Cc
显示最后命令的退出状态为:0

shell 运算符

测试comple.sh

#! /bin/bash

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
 echo 'a == b'
else
 echo 'a != b'
fi

测试结果

songwei@songwei-virtual-machine:~/shell_test$ ./comple.sh 
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a != b

关系运算符

在这里插入图片描述

测试文件

#!/bin/bash
a=10
b=20

if [ $a -eq $b ]
then
    echo "1:  $a -eq $b : a 等于 b"
else
    echo "1:  $a -eq $b: a 不等于 b"
fi

if [ $a -ne $b ]
then
    echo "2: $a -ne $b: a 不等于 b"
else
    echo "2: $a -ne $b : a 等于 b"
fi

if [ $a -gt $b ]
then
     echo "3: $a -gt $b: a 大于 b"
else
     echo "3: $a -gt $b: a 不大于 b"
fi

if [ $a -lt $b ]
then
     echo "4: $a -lt $b: a 小于 b"
else
     echo "4: $a -lt $b: a 不小于 b"
fi

if [ $a -ge $b ]
then
     echo "5: $a -ge $b: a 大于或等于 b"
else
     echo "5: $a -ge $b: a 小于 b"
fi

if [ $a -le $b ]
then
     echo "6: $a -le $b: a 小于或等于 b"
else
     echo "6: $a -le $b: a 大于 b"
fi

if

if condition1
then
 command1
elif condition2
then
 command2
else
 commandN
fi

例子

a=10
b=20
if [ $a == $b ]
then
 echo "a 等于 b"
elif [ $a -gt $b ]
then
 echo "a 大于 b"
elif [ $a -lt $b ]
then
 echo "a 小于 b"
else
 echo "没有符合的条件"
fi

for

for var in item1 item2 ... itemN
do
 command1
 command2
 ...
 commandN
done

例子

for loop in 1 2 3 4 5
do
  echo "The value is: $loop"
done
for str in 'This is a string','hello moto'
do
  echo $str
done

while

while condition
do
 command
done

例子

# Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
#!/bin/bash
int=1
while(( $int<=5 ))
do
  echo $int
 let "int++"
done
# 无限循环
while true
do
 command
done

break

#!/bin/bash
while :
do
  echo -n "输入 1 到 5 之间的数字:"
 read aNum
 case $aNum in
    1|2|3|4|5) echo "你输入的数字为 $aNum!"
   ;;
   *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
     break
   ;;
  esac
done

continue

#!/bin/bash
while :
do
  echo -n "输入 1 到 5 之间的数字: "
 read aNum
 case $aNum in
    1|2|3|4|5) echo "你输入的数字为 $aNum!"
   ;;
   *) echo "你输入的数字不是 1 到 5 之间的!"
     continue
      echo "游戏结束"
   ;;
  esac
done

函数

#!/bin/bash
## 第一个函数------------------------------

demoFun(){
  echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

## 函数返回值------------------------------

funWithReturn(){
  echo "这个函数会对输入的两个数字进行相加运算..."
  echo "输入第一个数字: "
 read aNum
  echo "输入第二个数字: "
 read anotherNum
  echo "两个数字分别为 $aNum$anotherNum !"
 return $(($aNum+$anotherNum))

}
funWithReturn

# 函数返回值在调用该函数后通过 $? 来获得。
echo "输入的两个数字之和为 $? !"

## 函数参数------------------------------

funWithParam(){
  echo "第一个参数为 $1 !"
  echo "第二个参数为 $2 !"
#  echo "第十个参数为 $10 !"
#  echo "第十个参数为 ${10} !"
#  echo "第十一个参数为 ${11} !"
  echo "参数总数有 $# 个!"
  echo "作为一个字符串输出所有参数 $* !"

}
funWithParam $aNum $anotherNum
#funWithParam 1 2 3 4 5 6 7 8 9

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang每日一练(leetDay0033) 二叉树专题(2)

目录 97. 交错字符串 Interleaving String &#x1f31f;&#x1f31f; 98. 验证二叉搜索树 Validate Binary Search Tree &#x1f31f;&#x1f31f; 99. 恢复二叉搜索树 Recover Binary Search Tree &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &am…

DFIG控制6-c:数字控制延时的分析和补偿

DFIG控制6-c&#xff1a;数字控制延时的分析和补偿 本文基于教程的第6部分。 DFIM Tutorial 6 - Dynamic Analysis of Current Loops in a Wind Turbine based on DFIG 教程提到了这本书&#xff1a; S.-K. Sul, Control of Electric Machine Drive Systems. John Wiley &…

好用的待办事项APP有哪些

你是否有这样的感受&#xff0c;这就是随着生活和工作节奏的加快&#xff0c;自己经常会面临各种各样的待办事项需要去完成&#xff0c;例如会议安排、每天的工作计划、学习任务等等。但是我们的大脑记忆是有限的&#xff0c;难免会出现忘记待办事项的情况&#xff0c;为了更好…

外包干了三年,算是废了...

先说一下自己的情况。大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近3年的测试&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了三年&#xff0c…

detr训练自己的数据集

参考链接&#xff1a; https://zhuanlan.zhihu.com/p/490042821?utm_id0 transform结构&#xff1a; 原理&#xff1a;https://blog.csdn.net/weixin_44649780/article/details/126808881?spm1001.2014.3001.5501 图2&#xff1a; DETR使用一个传统的CNN主干来学习一个输入…

Densely Connected Pyramid Dehazing Network

Abstract 提出了一种新的端到端的单幅图像去雾方法&#xff0c;称为稠密连接金字塔去雾网络&#xff08;DCPDN&#xff09;&#xff0c;该方法可以联合学习透射图、大气光照和去雾。通过将大气散射模型直接嵌入到网络中&#xff0c;实现了端到端的学习&#xff0c;从而保证了所…

【使用教程】CANopen一体化伺服电机在汇川H5U PLC上的应用(上)

本文内容主要介绍了立迈胜一体化低压伺服CANopen通信的电机在汇川H5UPLC上的使用&#xff0c;本篇主要讲解环境的搭建以及软件自带的调试功能使电机运动起来。 一、系统构成 本系统主要构成是笔记本电脑、汇川PLC(H5U-1614MTD-A8)、PMM60系列一体化伺服电机(PMM6040B-CANopen)…

Maxon One 春季版本更新动态

2023年3月29日&#xff0c;Maxon&#xff0c;为剪辑师、电影制作人、动态设计师、视觉特效艺术家和各类创作者提供专业软件解决方案的开发商&#xff0c;今天宣布对Maxon One进行全面更新。 Maxon的2023年春季版本在整个产品系列中提供了令人振奋的新功能和工作流程改进&#x…

创略科技联合创始人兼总裁杨辰韵:AIGC、隐私计算赋能数字营销的本质是“以客户为中心”丨数据猿专访...

‍数据智能产业创新服务媒体——聚焦数智 改变商业MarTech概念现身已超十年&#xff0c;伴随着企业数字化转型的大背景&#xff0c;中国MarTech市场也迎来了高速发展。据《2022年中国MarTech市场洞察报告》数据显示&#xff0c;2017-2021年&#xff0c;中国 MarTech产业规模从…

windows服务器自带IIS搭建网站并发布公网访问【内网穿透】

文章目录1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置4.公网访问测试5.结语转载自远程源码文章&#xff1a;【IIS搭建网站】本地电脑做服务器搭建web站点并公网访问「内网穿透…

普通人是否能从ChatGPT中分一杯羹?

ChatGPT3.0刚刚推出&#xff0c;最开始的时候&#xff0c;人们只是将ChatGPT看作一个很会聊天的机器人&#xff0c;无论问题多么天马行空&#xff0c;它的答案看上去都有理有据。后来&#xff0c;像打开潘多拉魔盒一样&#xff0c;很多人开始拿它编大纲、撰写文案、编代码、创作…

Apache 配置与应用

目录构建虚拟 Web 主机基于域名的虚拟主机1&#xff0e;为虚拟主机提供域名解析2.为虚拟主机准备网页文档3.添加虚拟主机配置4.设置访问控制5.加载独立的配置文件6.在客户机中访问虚拟 Web 主机基于IP地址的虚拟主机基于端口的虚拟主机Apache 连接保持构建Web虚拟目录与用户授权…

Sequence(二分 + 线段树)

H-Sequence_2020ICPC 江西省大学生程序设计竞赛&#xff08;重现赛&#xff09;Joanh_Lan (nowcoder.com) 题目描述 给定一个包含n个整数的数组a&#xff0c;你要对它执行两种类型的m个操作。1.给定两个整数x,y&#xff0c;将索引x的个数替换为数字y&#xff0c;即ax:y。2.给定…

【软考五】数据库(做题)

该文章不适合学习数据库&#xff0c;适合考证&#xff0c;遇到实际问题的&#xff0c;不要在这儿浪费时间。切记切记 软考之数据库一、概念数据模型&#xff08;下午题常考&#xff09;二、结构数据模型关系模型1、关系模型中基本术语2、关系模型中的关系完整性约束3、关系代数…

蓝桥杯 回忆迷宫 BFS DFS暴力模拟

⭐ 题目地址 样例输入 17 UUUULLLLDDDDRRRRU样例输出 ***** * * * *** * * *** * * *** * * ******&#x1f920; 注意方向&#xff1a;颠倒数组&#xff0c;行下标 是 y&#xff0c;列下标 是 x import java.util.*;public class Main { static int n;static int …

如何用jmeter+ant+jenkins搭建一个接口自动化测试框架?

目录 前言 一、什么是Jmeter&#xff1f; 二、什么是Ant&#xff1f; 三、什么是Jenkins&#xff1f; 四、如何构建一个JmeterAntJenkins的接口自动化测试框架&#xff1f; 五、JmeterAntJenkins接口自动化测试框架的优势和特点 六、总结 前言 Jmeter是一款功能强大的开…

2023年Win11备份文件的快捷方式

文件备份对于数据保护非常重要。无论是什么类型的文件&#xff0c;如照片、文档、音频、视频&#xff0c;它们对您来说都是独一无二的、珍贵的&#xff0c;因此您想备份文件并保护它们。 首先&#xff0c;备份文件无疑是保护文件的好习惯&#xff0c;尤其是定时备份。其次&…

笔记本可自行更换CPU、独显了,老外用它手搓了台“PS5”

前面说到微软打算在 Win12 出来前搞出个模块化的Windows&#xff1a;下一个系统不是Win12&#xff0c;微软要复活Win10X。 模块化不用小蝾再过多介绍了&#xff0c;就像积木一样拼在一起组成一个整体。 优势就很明显了&#xff0c;由于每个部分都是单独的模块&#xff0c;更新…

ChatGPT如何写作-怎么让chatGPT批量写作

ChatGPT如何写作 使用 ChatGPT 进行写作一般可以遵循以下步骤&#xff1a; 定义写作主题和目的。确定写作主题和目的&#xff0c;包括要解决的问题、目标读者群体以及需要涵盖的主要内容。 收集文献和资料。收集与主题相关的文献和资料&#xff0c;可以从互联网、书籍、报刊杂…

Spring Cloud组件源码之OpenFeign源码分析

" Spring 到底是春天的来临万物复苏&#xff0c;还是春转夏的干燥又炎热呢&#xff1f;" Spring的来临让JavaEE走向了另一个高度。便捷的开发&#xff0c;完美的生态。物极必反&#xff0c;学习Spring的成本越来越低&#xff0c;导致Java程序员越来越密集&#xff0…