Linux系列--shell编程一

news2024/11/17 21:44:49

一、Linux系统结构

一、内核层

内核是Linux系统的核心部分,它负责管理系统各种硬件设备、文件系统、内存管理和进程管理等核心任务。Linux内核设计了良好的模块化结构,可以动态地加载和卸载内核模块,这使得内核可以兼容各种不同的硬件设备和外围设备。

二、Shell层

Shell是Linux系统的命令行解释器,它负责将用户输入的命令解释并执行。Linux系统上有多种Shell,其中最常用的是Bash Shell。Bash Shell 提供了各种丰富的功能和处理能力,如通配符、重定向、管道、变量等等。

 三、应用层

应用层是Linux系统上的各种应用程序和服务,包括文本编辑器、图形界面、Web服务器、邮件服务器、数据库服务器等。在Linux系统中,应用程序通常以开放源代码方式呈现,用户可以自由学习和使用,也可以根据需求自己编写、修改或扩展。

二、shell基础语法

一、shell介绍

Shell是一种用于与操作系统进行交互的命令行解释器。它是一种脚本语言,可以通过编写一系列的命令和脚本来执行操作系统的功能和任务。

二、shell的种类

  1. Bourne Shell(/bin/sh):是Unix系统最早的shell程序,由史蒂夫·伯恩斯(Steve Bourne)编写。该shell程序是许多Linux发行版中默认使用的程序。
  2. Bourne-Again SHell(/bin/bash):是GNU项目的一部分,是Bourne Shell的增强版,目前在大部分Linux发行版中是默认的shell程序。
  3. C Shell (/bin/csh):是Bill Joy编写的一个具有面向对象设计理念的shell程序,它采用与C语言相似的语法和控制结构。C Shell中的命令提示符为%号。
  4. TENEX C Shell(/bin/tcsh):是C Shell的增强版,它对历史命令和别名等方面进行了改进,同时也支持C Shell中的所有特性。TENEX C Shell中的命令提示符也为%号。
  5. Korn Shell(/bin/ksh):是由David Korn编写的shell程序,它是Bourne Shell和C Shell的结合,拥有两种不同的工作模式:交互模式和批处理模式。
  6. Z Shell(/bin/zsh):是一个功能强大的shell程序,它是Bourne Shell的增强版,具有缩写、自动完成、句法高亮等功能,同时也支持Korn Shell、C Shell以及Bourne Shell的语法和命令。

 三、基础语法

shell脚本可以编写在一个xxx.sh结尾的文件中,xxx.sh文件我们称为shell脚本文件。
shell脚本文件是一个可执行文件,类似于windows环境中的xxx.exe 或 xxx.bat 等文件。

一、切换shell

在CentOS中,可以使用chsh命令切换默认Shell。chsh命令允许您更改用户的登录Shell。以下是切换Shell的步骤:

1、查看已安装的Shell。

cat /etc/shells

2、更改Shell。

chsh -s /bin/sh

3、重新登录后:检查Shell是否已更改

echo $SHELL

二、注释 

一、单行注释

单行注释是一行文本,它以井号(#)开头,从该字符开始一直延伸到该行的结束。在此行内,任何内容都会被 Shell 解释器忽略:

# 这是一行注释
echo "Hello, World!"  # 这是一行带有注释的代码

二、多行注释

Shell 脚本也支持多行注释,这种注释也被称为块注释。块注释在脚本中可以用于分组一系列代码,或将一段代码置于未被执行的状态。在 Bash Shell 中,块注释通常使用以下语法:和'之间有一个空格,这个不能忽略,否者会出错。

: '
这里是注释内容。
可以是多行,直到下面一行的单独引号为止。
'

三、变量 

一、shell变量有三种:

  1. 环境变量
  2. 本地变量
  3. 特殊变量

二、环境变量

1、环境变量是在Shell会话外设置的,可以由多个脚本和进程共享。在Linux中,环境变量没有固定的值,而是在需要时通过脚本或命令进行设置或更新。(系统环境变量一般在/etc/profile文件中设置。

2、查看当前所有环境变量

printenv
或
env

3、设置一个新的环境变量

export MY_VAR="Hello World"

4、要使用环境变量,在变量名称前必须加上$符号

echo $MY_VAR

三、本地变量

一、shell脚本变量命名规范

  1. 变量名由字母、数字和下划线组成。
  2. 不能以数字开头。
  3. 区分大小写。
  4. 等号两侧不能有空格。
  5. 不能使用特殊字符作为变量名,如$, &, !, (, ), *等。
  6. 环境变量一般是全部大写,单词和单词之间采用下划线分割:JAVA_HOME, CATALINA_HOME
  7. 本地变量一般是小写

二、本地变量是一种临时变量,在Shell会话中设置和使用。与环境变量不同,本地变量仅限于当前Shell会话,不会被其他脚本或命令使用。设置本地变量可以使用“=”号操作符。

my_var="Hello World"

echo $my_var

四、特殊变量

一、特殊变量是在Shell中预定义的变量名称,具有特殊的含义。这些变量与当前Shell会话有关,可以用于许多不同的用途,包括文件和目录操作、命令历史记录和处理脚本参数等等。

二、常见的一些特殊变量

  • $0: 当前脚本的文件名
  • $1, $2...: 脚本参数列表中的第1个、第2个参数等等 (例如:./first.sh abc def,在执行这个脚本时,第一个参数abc,第二个参数def。)
  • $#: 脚本参数的数量
  • $*: 所有脚本参数的列表(将所有的参数作为一个字符串:"zhangsan lisi wangwu")
  • $@: 所有脚本参数的列表(将每一个参数作为一个独立的字符串:"zhangsan" "lisi" "wangwu")
  • $$: 当前脚本的进程ID号
  • $?: 上一个命令的退出状态,一个数值。

三、$? 这个特殊变量的用法

ls -l /etc/passwd
if [ $? -eq 0 ]; then
  echo "ls command succeeded"
else
  echo "ls command failed"
fi

这个变量可以用来获取上一条命令的执行结果是否正确,如果执行结果是0表示成功,其他值表示失败

四、控制语句 

一、shell中的中括号用法

一、用于比较操作符:用于比较两个值的大小或者判断两个值是否相等

  • -eq: 判断两个值是否相等(equal to),例如[ $a -eq $b ]
  • -ne: 判断两个值是否不相等(not equal to),例如[ $a -ne $b ]
  • -lt: 判断左边的值是否小于右边的值(less than),例如[ $a -lt $b ]
  • -gt: 判断左边的值是否大于右边的值(greater than),例如[ $a -gt $b ]
  • -le: 判断左边的值是否小于等于右边的值(less than or equal to),例如[ $a -le $b ]
  • -ge: 判断左边的值是否大于等于右边的值(greater than or equal to),例如[ $a -ge $b ]

在Shell中,比较操作符可以用于中括号[]中,例如:[ $a -eq $b ]。在比较时,要注意两个值之间必须有空格分隔,否则会出现语法错误。

二、用于测试表达式:用于测试某个表达式是否成立

  • -f: 判断某个文件是否存在并且是一个常规文件(regular file),例如[ -f file.txt ]
  • -d: 判断某个文件是否存在并且是一个目录(directory),例如[ -d dir ]
  • -z: 判断某个字符串是否为空(zero length),例如[ -z "$str" ]
  • -n: 判断某个字符串是否非空(not zero length),例如[ -n "$str" ]
  • -e: 判断某个文件或目录是否存在(exist),例如[ -e file.txt ]

在Shell中,测试表达式也可以用于中括号[]中,例如:[ -f file.txt ]。在多数Linux发行版中,测试表达式可以用中括号[]或者test命令实现,例如:test -f file.txt等价于[ -f file.txt ]。需要注意的是,中括号中的空格很重要,空格缺少会导致语法错误。另外,在使用中括号[]时,要注意变量用双引号括起来,避免空值引起的语法错误。

二、if语句详解

if condition 
then
  command1
  command2
  ...
elif condition2 
then
  command3
  command4
  ...
else
  command5
  command6
  ...
fi




栗子:

#!/bin/bash

if [ -f file.txt ] 
then
  echo "file.txt exists."
elif [ -d dir ] 
then
  echo "dir exists."
else
  echo "file.txt and dir not found."
fi

其中,condition是要检查的条件,可以是命令、变量、表达式等任何Shell语法,then表示条件成立要执行的语句块,如果有多个条件,可以使用elif语句来添加多个条件,每个条件使用then分别表示要执行的语句块,如果所有条件都不成立,则执行else分支中的语句块。
if语句的执行过程是从上到下依次判断每个条件,如果条件成立,则执行对应的语句块,执行完后跳出if语句。

栗子:

#!/bin/bash

if [ -f file.txt ] 
then
  echo "file.txt exists."
elif [ -d dir ] 
then
  echo "dir exists."
else
  echo "file.txt and dir not found."
fi

三、for循环详解

1、语法

for var in list
do
  command1
  command2
  ...
done

其中,var是一个临时的变量名,用于存储当前循环的值,list是一个值或者多个带有空格或换行符分隔的值组成的列表。在每一次循环迭代时,var会被list列表中的一个值所替换,直到list中的所有值都被处理完为止。

#!/bin/bash

for i in 1 2 3 4 5
do
  echo "The value of i is: $i"
done

四、while循环详解

1、语法:

while condition
do
  command1
  command2
  ...
done

其中,condition是要检查的条件,如果条件为真,则执行do语句块中的命令,执行完后再回到while语句中检查条件是否依然为真,如果条件仍为真,则继续执行命令块,否则跳出循环。

注意:在shell编程中 ((...)) 被称为算术扩展运算符,做数学运算的,并且将运算结果返回。(...)运算符会将结果直接返回。

  • $((j+1)),如果j是5的话,结果就会返回6 (注意,使用这个运算符的时候,括号里面不能有空格)
  • $(echo "hello world"),会将"hello world"打印,然后再将"hello world"字符串返回。

栗子:

#!/bin/bash

j=0
while [ $j -lt 5 ]
do
  echo "The value of j is: $j"
  j=$((j+1))
done

五、until循环详解

1、语法:

until condition
do
  command1
  command2
  ...
done

其中,condition是要检查的条件,如果条件为假,则执行do语句块中的命令,执行完后再回到until语句中检查条件是否依然为假,如果条件仍为假,则继续执行命令块,否则跳出循环。

#!/bin/bash

k=0
until [ $k -ge 5 ]
do
  echo "The value of k is: $k"
  k=$((k+1))
done

六、break和continue语句

1、break语句用于跳出当前循环块,例如在for循环和while循环中使用该语句时,可以跳出当前循环并停止迭代。break语句可以嵌套在多重循环中,用于跳出内层循环和外层循环

while condition
do
  command1
  command2
  if condition2 
    then
    break
  fi
  command3
  ...
done

在上述示例中,如果在执行command2时,条件condition2成立,那么会执行break语句,跳出循环块并停止迭代。

2、continue语句用于跳过本次循环迭代,直接进入下一次的迭代。在for循环和while循环中使用该语句时,可以用于跳过本次迭代,执行下一次迭代。其语法格式如下

while condition
do
  command1
  command2
  if condition2
  then
    continue
  fi
  command3
  ...
done

如果在执行command2时,条件condition2成立,那么会执行continue语句,跳过本次迭代,直接进入下一次迭代。

栗子:

#!/bin/bash

for l in 1 2 3 4 5
do
  if [ $l -eq 3 ] 
    then
    continue
  fi
  echo "The value of l is: $l"
  if [ $l -eq 4 ] 
    then
    break
  fi
done

五、函数

一、什么是函数

在Shell编程中,函数是一种可重用的代码块,其实就是相当于java的方法。

二、定义函数

1、语法

function_name() {
    commands
}

2、栗子

function say_hello() {
  echo "Hello, world!"
}

使用function关键字来定义函数是可选的。当使用function关键字时,要注意不要加空格,否则会出现语法错误。函数体中可以包含任意数量的命令和语句。

三、调用函数

成功定义一个函数后,可以在程序的任何地方调用它。只需要使用函数的名称,即可调用函数。例如:

say_hello

四、传递参数

Shell函数也支持传递参数。在调用函数时,可以把参数传递给函数,让函数使用这些参数来完成特定的任务

function greet() {
  echo "Hello, $1 $2"
}

greet "John" "Doe"

上述示例中,我们定义了一个名为greet的函数,它输入参数1和2,并把这些参数用于输出字符串Hello, $1 $2。我们调用greet函数,并把参数"John"和"Doe"传递给它,最终输出Hello, John Doe字符串。

在函数中,参数可以使用1、2、3等占位符来引用。1表示第一个参数,$2表示第二个参数,以此类推。

栗子:

#!/bin/sh

# 定义函数say_hello
say_hello() {
  echo "Hello, world!"
}

# 调用函数say_hello
say_hello

# 定义函数greet
greet() {
  echo "Hello, $1 $2"
}

# 调用函数greet
greet "John" "Doe"

 

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

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

相关文章

【微软蓝屏】构建更加稳固和安全的网络环境:从“微软蓝屏”事件谈起

最近,那个让全球都头疼的“微软蓝屏”事件,简直就像是科技界的一场大地震。你说这背后的原因,竟然是一个软件更新的小失误?哎呀,这可真是让人哭笑不得。不过,笑归笑,这事儿也给我们提了个醒&…

学习调试:CubeMX点亮LED灯+按键点亮LED灯0.5ms后熄灭+使用User Lable提高代码的重用性

一、CubeMX 点亮 LED 灯 1.1 CubeMX 中操作 1、打开 CubeMX → file → new project 新建一个工程→ 搜索框里输入芯片型号→双击选择芯片对应封装等待 2、根据上面深蓝/浅蓝的导航对 IO 口进行配置: (1)Pinout & Configuration&…

如何利用开源Bug管理系统提高团队效率

国内外主流的10款开源bug管理系统对比:PingCode、Worktile、Trac、WebIssues、MantisBT、Bugzilla 、Fossil、The Bug Genie、TestLink 、OpenProject。 在软件开发的复杂世界中,Bug管理可能是一个令人头疼的问题,尤其是当工具不足以捕捉和解…

C语言进阶版—扫雷游戏

文章目录 1. 打印棋盘2. 游戏逻辑3. 游戏框架3.1 打印菜单3.2 do……while实现主逻辑3.3 创建棋盘3.4 初始化棋盘3.5 设置雷3.6 排查雷 完整游戏代码 1. 打印棋盘 在正式讲解扫雷游戏之前,我们简单来看一下打印出来的棋盘.   第一步我们要打印每行的框架 printf…

一文带你读懂TCP

文章目录 1 TCP协议1.1 TCP 基础1.1.1 TCP 特性1.2.2 TCP连接数 1.2 TCP 头1.2.1 TCP 头格式1.2.2 MTU,MSS,分片传输 1.3 TCP 连接三路握手1.4 TCP 断开四次挥手1.5 SYN攻击和防范1.6 重传机制1.6.1 超时重传1.6.2 快速重传1.6.3 SACK 1.7 滑动窗口1.8 流…

【Vulnhub系列】Vulnhub_DC-1靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_DC-1靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境准备 1、在百度网盘中下载DC-1靶场。DC-1靶场受virtual box 的影响,在VM中直接打开是扫描不到IP 的…

基于Java的微博传播分析系统的设计与实现

1 项目介绍 1.1 摘要 本文致力于展示一项创新的微博传播分析系统设计与应用研究,该系统基于Java技术,巧妙利用大数据环境下的社交媒体——微博的庞大用户群及高度活跃特性,旨在深度探索信息传播的内在逻辑与社会影响机制。研究开篇明确定了…

【网络安全】文件上传黑白名单及数组绕过技巧

不安全的文件上传(Unsafe FileUpload) 不安全的文件上传是指Web应用程序在处理用户上传的文件时,没有采取足够的安全措施,导致攻击者可能利用这些漏洞上传恶意文件,进而对服务器或用户造成危害。 目录 一、文件上传…

20240729 每日AI必读资讯

Meta科学家最新采访,揭秘Llama 3.1是如何炼成的 - Llama 3.1都使用了哪些数据?其中有多少合成数据?为什么不使用MoE架构?后训练与RLHF流程是如何进行的?模型评估是如何进行的? - 受访者Thomas Scialom现任…

在Android上实现汉字笔顺动画效果——HanZiWriter

序,万般皆是命,半点不由人。 Hanzi Writer 是 javascript 免费开源库,根据汉字书写时按照笔画顺序的特征,可以播放正确笔画顺序的描边动画和练习测试。支持简体字和繁体字。可以让全球用户能够通过手绘模仿的方式来学习和练习书写…

复杂系统的动态演化与自相似性探究——揭示系统内部的结构与行为模式

复杂系统的动态演化与自相似性探究——揭示系统内部的结构与行为模式 动态演化与自相似性的核心思想 想象一下,你正在观察一棵树的生长。随着时间的推移,树会不断长高,长出新的叶子和枝条。这就是动态演化。同时,你会发现树的每一…

甄选范文“论企业集成架构设计及应用”软考高级论文,系统架构设计师论文

论文真题 论企业集成架构设计及应用企业集成架构(Enterprise Integration Arhitecture,EIA) 是企业集成平台的核心,也是解决企业信息孤岛问题的关键。企业集成架构设计包括了企业信息、业务过程、应用系统集成架构的设计。实现企业集成的技术多种多样,早期的集成方式是通过…

LexLIP——图片搜索中的多模态稀疏化召回方法

LexLIP——图片搜索中的多模态稀疏化召回方法 FesianXu 20240728 at WeChat Search Team 前言 最近笔者在回顾&笔记一些老论文,准备整理下之前看的一篇论文LexLIP,其很适合在真实的图片搜索业务场景中落地,希望笔记能给读者带来启发。如…

业务记录:处理动态表头的CSV/EXCEL文件

业务描述:传入一个动态表头的CSV文件,解析CSV,并保存入库。 CSV文件的表头是不确定的,即顺序和字段个数不确定,以及表头是中文字段。 例如: 为了顺利解析CSV文件,前端需要传入对应的字段名和顺…

Qwen-VL全文翻译(from GPT-4o)

目录 Abstract1 Introduction2 Methodology2.1 Model Architecture2.2 Inputs and Outputs 3 Training3.1 Pre-training3.2 Multi-task Pre-training3.3 Supervised Fine-tuning 4 Evaluation4.1 Image Caption and General Visual Question Answering4.2 Text-oriented Visual…

01 Go Web基础_20240728 课程笔记

概述 如果您没有Golang的基础,应该学习如下前置课程。 基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。 视频课程 最近发现越来越多…

【算法专题】双指针算法之18. 四数之和(力扣)

欢迎来到 CILMY23的博客 🏆本篇主题为:双指针算法之18. 四数之和(力扣) 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算…

网络安全威胁情报是什么,它对代工生产(OEM)意味着什么?

随着汽车数字环境的不断变化,网络安全基础设施及其面临的威胁也日趋复杂。 为了更好地识别、理解并最终预防这些风险,网络安全威胁情报(CTI)的管理应是一个综合多方面的过程。 以下是CTI对OEM的意义,以及如何利用网络…

代码随想录算法训练营第40天|LeetCode 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

1. LeetCode 198.打家劫舍 题目链接:https://leetcode.cn/problems/house-robber/ 文章链接:https://programmercarl.com/0198.打家劫舍.html#算法公开课 视频链接:https://www.bilibili.com/video/BV1Te411N7SX 思路: 递推公式&a…

Profinet从站转TCP/IP协议转化网关(功能与配置)

如何将Profinet和TCP/IP网络连接通讯起来呢?近来几天有几个朋友问到这个问题,那么作者在这里统一说明一下。其实有一个不错的设备产品可以很轻易地解决这个问题,名为JM-DNT-PN。接下来作者就从该设备的功能及配置详细说明一下。 一,设备主要…