Bash脚本基本语法

news/2024/11/19 19:32:41/文章来源:https://www.cnblogs.com/kakafa/p/18430631


一、Bash脚本以及相关介绍


Bash脚本是一种在Unix或Linux操作系统中广泛使用的脚本语言,它允许用户编写一系列命令,这些命令将被Bash(Bourne-Again SHell)解释器执行。Bash脚本可以用于自动化各种任务,比如文件管理、程序执行、系统维护等。

编写Bash脚本的基本步骤包括:

  • 创建脚本文件‌:使用文本编辑器创建一个新的文本文件,通常以.sh作为文件扩展名,例如script.sh。

  • 编写脚本内容‌:在脚本文件中编写Bash命令和脚本逻辑。你可以使用文本编辑器来编辑和保存脚本。

  • 赋予执行权限‌:在Unix或Linux系统中,你需要为脚本文件赋予执行权限,才能运行它。可以使用chmod命令来设置权限,例如chmod +x script.sh。

  • 运行脚本‌:在终端或命令行界面中,你可以通过输入脚本文件的路径来运行它,例如./script.sh。




(1) bat文件和exe文件、elf文件、.sh文件均为可执行文件:

  • 操作系统环境‌:

.bat文件:Windows系统上的批处理文件,通常使用批处理语言编写。
exe文件:Windows系统上的可执行文件,不是文本文件,不可以使用记事本编辑。
elf文件:Linux系统下的可执行文件,通常以ELF格式保存。
.sh文件:Unix/Linux系统上的脚本文件,通常使用Shell语言编写。

  • 功能和用途‌:

.bat文件:主要用于执行一系列命令或操作,简化日常或重复性任务。
exe文件:直接执行的文件,功能丰富,执行效率相对较低。
elf文件:用于执行各种系统管理、自动化任务等,功能强大。
.sh文件:用于编写脚本,执行各种系统管理、自动化任务等,语法灵活丰富。


(2) 批处理文件和脚本文件区别:

  • 操作系统环境‌:批处理文件(.bat或.cmd)主要在Windows系统中使用,而脚本文件(如.sh)则在Unix/Linux系统中更为常见。
  • 解释器‌:批处理文件通常不需要指定解释器,直接由cmd或PowerShell执行。脚本文件则通常以#!开头,指定了脚本要使用的解释器,如Bash或Sh。
  • 语法和功能‌:批处理文件的语法相对简单,主要用于执行一系列命令或操作。脚本文件的语法更加灵活和丰富,可以包含各种命令、条件语句、循环等功能。

(3)‌CMD和PowerShell区别

  • CMD‌:CMD是命令提示符(Command Prompt)的缩写,是一个文本界面的命令行工具,允许用户通过键入文本命令来与计算机进行交互和执行各种任务。它提供了基本的命令行交互功能,如文件管理、进程管理、网络管理等。CMD是Windows系统自带的命令行工具,功能相对简单,主要用于基本的命令执行‌12。

  • PowerShell‌:PowerShell是一种更强大和灵活的命令行工具,它基于.NET Framework,并支持更复杂的脚本编写和执行。PowerShell提供了一整套强大的命令和功能,可以进行更高级的管理和自动化操作,适合进行系统管理和自动化任务‌




二、Bash脚本基本语法和结构


Linux脚本有很多解析器(Shell),不同解析器要求的脚本语法不一样。系统在解析脚本时,如果没有在脚本声明指定解析器,则会采用系统默认解析器来对脚本进行解析。在大多数 Linux 发行版中,Bash 是默认的 Shell,广泛用于写脚本和日常命令行操作。



1. 脚本声明

每个 Bash 脚本通常以 #!/bin/bash 开头, 表示使用 Bash 来执行该脚本。

#!/bin/bash

2. 注释

使用 # 来添加注释,注释不会被执行。


3. 变量

#定义变量
name="Alice"
age=25
#使用变量
bash
echo "Name: $name"
echo "Age: $age"

注意:

  • 在赋值时不要有空格。
  • 访问变量时需要加 $ 符号。

4. 条件语句

if 语句

if [ "$age" -gt 18 ]; thenecho "成年人"
elseecho "未成年人"
fi

case 语句

case $name inAlice)echo "Hello, Alice!";;Bob)echo "Hello, Bob!";;*)echo "Hello, stranger!";;
esac

5. 循环

for 循环

for i in {1..5}; doecho "Number: $i"
done

while 循环

count=1
while [ $count -le 5 ]; doecho "Count: $count"((count++))
done

6. 函数

定义函数的基本语法如下:

function greet {echo "Hello, $1!"
}greet "World"

7. 脚本参数

可以在命令行中传递参数到脚本中。

echo "第一个参数: $1"
echo "第二个参数: $2"

8. 输入与输出

输出文本

使用 echo 或 printf: echo将给定的每个字符串写入标准输出,每个字符串之间有一个空格,最后一个字符串后面有一个换行符

echo "Hello, World!"
printf "Hello, %s!\n" "World"

读取用户输入

read -p "请输入您的名字: " user_name  # -p 除了从标准输入读取数据外,还允许你在读取输入之前显示一个提示信息。
echo "欢迎, $user_name!"

9. 错误处理

使用 $? 获取上一个命令的退出状态。

mkdir /some/directory
if [ $? -ne 0 ]; thenecho "创建目录失败"
fi

10. 执行脚本

确保脚本具有可执行权限,然后执行:

chmod +x script.sh
./script.sh

11.脚本组织方式

脚本是由命令组成的,而命令的执行都是单独的,即使报错也不影响下一条命令的执行;一行语句可以包含多个命令,用";"隔开。


三、bash脚本实例


1. 输出Hello World字符串


app.bash

#!/bin/bashecho "Hello, World!"


2. 统计当前目录下文件数量


#!/bin/bashcount=$(ls -1 | wc -l)echo "There are $count files in the current directory."

其中count=$(ls -1 | wc -l)

ls -1
ls 命令用于列出当前目录中的文件和子目录。
-1 选项表示每个文件或目录在输出中占一行。这使得输出格式简单,便于后续处理。

|
管道符号 | 将前一个命令的输出传递给后一个命令。在这里,它将 ls -1 的输出传递给 wc -l。

wc -l
wc(word count)命令用于统计文本的行数、字数和字符数。
-l 选项表示只统计行数。在这里,它计算 ls -1 输出的行数,即当前目录中文件和子目录的数量。

count=$(...)
使用 $() 语法将命令的输出赋值给变量 count。因此,count 将保存当前目录中的文件和子目录的数量。


报错:

原因:

  • 在 Windows 系统上创建或编辑了 Bash 脚本,然后将其复制到 Linux 系统上,
  • 使用某些文本编辑器(如 Notepad)保存文件时,默认使用了 Windows 格式的换行符。
  • 脚本文件中包含了 Windows 风格的换行符(\r\n),而在 Unix/Linux 系统中,换行符应为 \n

解决:
使用 dos2unix 工具---dos2unix 是一个专门用来转换文件格式的工具,可以将 Windows 风格的换行符转换为 Unix 风格
1.先安装dos2unix工具:
对于 Ubuntu/Debian:sudo apt-get install dos2unix
2.执行转换命令:
dos2unix app.bash




参考链接:

https://blog.csdn.net/weixin_43431593/article/details/127550041

https://baijiahao.baidu.com/s?id=1791755709986252971&wfr=spider&for=pc



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

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

相关文章

【vulhub】Discuz-任意文件删除

【vulhub】Discuz-任意文件删除 0x00漏洞介绍 通过配置个人信息的属性值,导致文件删除。 影响版本Discuz <= 3.40x01 搭建环境 数据库服务器填写db(必须db,不然安装失败),数据库名为discuz,数据库账号密码均为root,管理员密码任意。填写联系方式页面直接点击跳过本步…

2024年开源API工具盘点,覆盖API全生命周期

2024年经济持续低迷,本文整理一些免费的开源工具,旨在帮助企业组织降低工具的支出成本,能用免费的何必用付费的呢(狗头)? 如何高效地管理API的全生命周期——从设计、开发、测试、部署到监控和优化,已经成为每个开发者和技术团队关注的重点。以下工具清单,无论你是刚刚…

Day4 与用户交互 + 格式化运算符 + 基本运算符

今天首先对昨天学的进行了复习,由这个复习可以看出昨天的我是多么的水*-*,今天的话倒是学的挺充实的,因为没有像上节课的jupyter notebook那样的东西(这节课看下来还是挺牛的,但也没到非用不可的时候,继续放着吧)。今天主要学习了三大部分,与用户的交互,格式化占位符,…

ACCESS 关于MSCOMCT2.OCX和MSCOMCTL.OCX报错的解决方案

我在ACCESS中添加了TreeView插件,结果电脑A上打开没问题,电脑B打开时就报MSCOMCT2.OCX和MSCOMCTL.OCX有错. B电脑之前是可以正常使用的,但是加了TreeView插件之后报错,说明是插件引用的问题. 在网上下载了这两个文件,复制到C:\WINDOWS\SYSTEM32目录下. 重新注册了这两个文件: 以…

74hc595

74htc595 功能 8位串行输入 8位串行或并行输出 带3态输出的存储 寄存器带直接清零的移位寄存器100 MHZ(典型) 移出频率 ESD保护H BM ELAJESD22-A114-A超过2000VMM EIAJESD23-A115-A超过200 V说明 74HC/HCT595是高速硅栅CMOS器件, 与低功率肖特基TTLLSTTL引脚兼容。 它们是根…

直接调拨单的酶活总量换算不正确

物料单位换算中的换算类型需要设置为浮动, 原来的是固定.

9月25日小学加减法的编程

根据问题要求来写程序,程序编写难度不高,交互更加友好 需要关注几个点 1加上目前是第几道题的说明 2如果输入错误要有提示第一第几道题是根据循坏的i来决定的但是要注意有些进入了循环但是没有进行答题的要写上i--; 第二要进行hasNextInt()的判断,防止错误输入导致的程序停…

Git - 初识版本库

版本库也叫仓库,英文名 repository。版本库也叫仓库,英文名 repository。 ‍ 创建版本库 之前我们说了版本库的概念:存储版本的地方(存放各个版本之间差异的地方),通常称为版本库。通常版本库是以文件(夹)的形式存放在磁盘上:Git 是用一个目录来存储各个版本和差异的文…

关于QT6.5.3版本安装、更新/添加组件的一些心得

目录引言 一、如何下载和卸载QT1.下载QT 2.卸载QT二、镜像引言 本文主要记录一下关于Visual Studio 2022和Qt Creator 14.0.1 (Community)的安装🛠️和配置⚙️ 起因是第一次下载QT时看着众多的组件不知如何选择,上网搜索攻略🔗看的头晕眼花(本来好简单的一件事🤣) 然…

超详细 Git 教程:二十篇博客,三万字干货

Git 是最流行的版本管理工具Git 是最流行的版本管理工具,可以说是任何程序员都应该掌握的工具。当然,其他人也可以学习它用来进行版本控制为此,我将之前学习 Git 时的笔记整理了下(预计有二十篇),作为博客发出来,希望能帮到你。本文简单介绍下什么是版本控制,以及常见的…

Python计算傅里叶变换

本文介绍了离散傅里叶变换和快速傅里叶变换的基本原理及其对应的Python代码实现,并将计算结果与numpy所集成的fft函数进行对比。其实现在FFT计算的成熟工具已经有很多了,不论是CPU上scipy的fft模块还是GPU上的cufft动态链接库,都有非常好的性能。但还是得真正去了解计算背后…

9月24日课件之动手动脑

在本次课件中有多个动手动脑作业,再次我逐一学习分析。 一、首先是关于枚举的学习代码为, 运行结果为。 首先第一个运行结果显而易见的是false,第二个是因为枚举为类所以不是基本类型,在.isprimitive()中基本类型是返回true,类的话将会返回false。 第三个是.valueof()会返…