您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > 百科

Bash 脚本编程入门

时间:2023-08-23 13:47:08  来源:微信公众号  作者:Linux中国

Shell 是 linux 的核心部分,它允许你使用各种诸如 cd、ls、cat 等的命令与 Linux 内核进行交互。

Bash 是 Linux 上众多可用的 Shell 中的一个。这些 Shell 主要的语法基本相同,但并非完全一样。Bash 是目前最受欢迎的 Shell,并在大多数 Linux 发行版中被设为默认 Shell。

当你打开一个终端或 SSH 会话时,即使你无法真切地看到它,你其实已经在运行着一个 Shell。

当你输入一个命令,它会被 Shell 解释。如果命令和语法是正确的,它就会被执行,否则你会看到一个错误。

当你可以直接运行 Linux 命令时,为什么还需要 Bash 脚本?

你可以直接在终端输入命令,它们就会被执行:

$ echo "hello world"
hello world

并且,同样的操作也可以在脚本中进行:

$ cat >> script.sh
#!/bin/bash
echo "hello world"
$ bash script.sh
hello world

那么,为什么我们需要 Shell 脚本呢?因为你不必一遍又一遍地输入同一个命令,你只需运行 Shell 脚本即可。

此外,如果你的脚本中有复杂的逻辑,把所有的命令都输入到终端中可能并不是一个好主意。

例如,如果你输入下面的命令,它会奏效,但这并不容易理解。不断地输入相同的命令(甚至要在 Bash 历史记录中搜索)会造成困扰。

if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi

相反,你可以把命令放进 shell 脚本中,这样就更容易理解并且可以轻松运行了:

#!/bin/bash
if [ $(whoami) = 'root' ]; then
    echo "You are root"
else
    echo "You are not root"
fi

这还是比较简单的情况。尝试想象一下,一个复杂的脚本可能有五十行或一百行!

你将会学到什么?

在这个 Bash 脚本教程中,有九个部分。你将会学到:

创建并运行你的第一个 Bash Shell 脚本

使用变量

在你的 Bash 脚本中传递参数和接受用户输入

进行数学计算

操作字符串

使用条件语句,例如 if-else

使用 for、while 和 until 循环

创建函数

所有的部分都会给你一个简单的例子。如果你愿意,你可以通过访问每个部分的详细章节来更深入地学习。这些章节也都包含了实践练习。

这个教程的目标读者是谁?

这个教程适合任何想要开始学习 Bash Shell 脚本的人。

如果你是一名学生,而你的课程里包括了 Shell 脚本,那么这个系列就是为你准备的。

如果你是一个常规的桌面 Linux 用户,这个系列将会帮助你理解在探索各种软件和修复问题时遇到的大多数 Shell 脚本。你也可以使用它来自动化一些常见的、重复的任务。

在这个 Bash 脚本教程结束时,你应该可以编写简单的 Bash 脚本。

希望你已经拥有 Linux 命令行和编程语言的基础知识。

1.编写你的第一个 Bash Shell 脚本

创建一个名为 hello.sh 的新文件:

nano hello.sh

这将在终端中打开 nano 编辑器。在其中输入以下几行代码:

#!/bin/bash
echo "Hello World"

通过按 Ctrl+X 键可以保存并退出 nano 编辑器。

现在,你可以以以下方式运行 Bash Shell 脚本:

bash hello.sh

你应该可以看到以下的输出:

Hello World

另一种方式是首先赋予脚本执行权限:

chmod u+x hello.sh

然后这样运行它:

./hello.sh

你也可以使用基于图形用户界面的文本编辑器来编写脚本。这可能更适合编写较长的脚本。然而,你需要切换到保存脚本的目录中才能运行它。

恭喜!你刚刚运行了你的第一个 Bash 脚本。

2、在 Bash 脚本中使用变量

变量的声明方式如下:

var=some_value

然后可以像这样访问变量:

$var

在声明变量时,等号(=)前后不能有空格。

我们通过添加一个变量来修改前面的脚本。

#!/bin/bash
message="Hello World"
echo $message

如果运行这个脚本,输出仍然会保持不变。

Hello World

3、向 Bash 脚本传递参数

你可以在运行 Bash 脚本时以以下方式传递参数:

./my_script.sh arg1 arg2

在脚本中,你可以使用 $1 来代表第 1 个参数,用 $2 来代表第 2 个参数,以此类推。$0 是一个特殊变量,它代表正在运行的脚本的名字。

现在,创建一个新的 shell 脚本,命名为 arguments.sh,并向其中添加以下几行代码:

#!/bin/bash
echo "Script name is: $0"
echo "First argument is: $1"
echo "Second argument is: $2"

使其可执行并像这样运行它:

$ ./argument.sh abhishek prakash
Script name is: ./argument.sh
First argument is: abhishek
Second argument is: prakash

让我们快速看一下特殊变量:

你也可以通过接受键盘输入使你的 Bash 脚本变得交互式。

为此,你必须使用 read 命令。你还可以使用 read -p 命令提示用户进行键盘输入,而不需要 echo 命令。

#!/bin/bash
echo "What is your name, stranger?"
read name
read -p "What's your full name, $name? " full_name
echo "Welcome, $full_name"

现在,如果你运行这个脚本,当系统提示你输入“参数”时,你必须输入。

$ ./argument.sh
What is your name, stranger?
abhishek
What's your full name, abhishek? abhishek prakash
Welcome, abhishek prakash

4、执行算术运算

在 Bash Shell 中执行算术运算的语法是这样的:

$((arithmetic_operation))

下面是你可以在 Bash 中执行的算术运算的列表:

以下是在 Bash 脚本中进行加法和减法的示例:

#!/bin/bash
read -p "Enter first number: " num1
read -p "Enter second number: " num2
sum=$(($num1+$num2))
sub=$(($num1-$num2))
echo "The summation of $num1 and $num2 is $sum"
echo "The substraction of $num2 from $num1 is $sub"

你可以执行 Shell 脚本,使用你选择的任意数字作为参数。

如果你尝试除法,会出现一个大问题。Bash 只使用整数。默认情况下,它没有小数的概念。因此,你会得到 10/3 的结果为3,而不是 3.333。

对于浮点数运算,你需要这样使用 bc 命令:

#!/bin/bash
num1=50
num2=6
result=$(echo "$num1/$num2" | bc -l)
echo "The result is $result"

这个时候,你将看到准确的结果。

  The result is 8.33333333333333333333

5、在 Bash 脚本中使用数组

你可以使用 Bash 中的数组来存储同一类别的值,而不是使用多个变量。

你可以像这样声明一个数组:

distros=(Ubuntu Fedora SUSE "Arch Linux" Nix)

要访问一个元素,使用:

${array_name[N]}

像大多数其他的编程语言一样,数组的索引从 0 开始。

你可以像这样显示数组的所有元素:

${array[*]}

这样获取数组长度:

${#array_name[@]}

6、Bash 中的基础字符串操作

Bash 能够执行许多字符串操作。

你可以使用这种方式获取字符串长度:

${#string}

连接两个字符串:

str3=$str1$str2

提供子字符串的起始位置和长度来提取子字符串:

${string:$pos:$len}

这里有一个例子:

你也可以替换给定字符串的一部分:

${string/substr1/substr2}

并且你也可以从给定字符串中删除一个子字符串:

   ${string/substring}

 

Bash 基础知识系列 #6:处理字符串操作

 

7、在 Bash 中使用条件语句

你可以通过使用 if 或 if-else 语句为你的 Bash 脚本添加条件逻辑。这些语句以 fi 结束。

单个 if 语句的语法是:

if [ condition ]; then
  your code
fi

注意使用 [ ... ]; 和 then 。

if-else 语句的语法是:

if [ expression ]; then
    ## execute this block if condition is true else go to next
elif [ expression ]; then
    ## execute this block if condition is true else go to next
else
    ## if none of the above conditions are true, execute this block
fi

这里有一个使用 if-else 语句的 Bash 脚本示例:

#!/bin/bash
read -p "Enter the number: " num
mod=$(($num%2))
if [ $mod -eq 0 ]; then
    echo "Number $num is even"
else
    echo "Number $num is odd"
fi
 

运行它,你应该能看到这样的结果:

-eq 被称为测试条件或条件操作符。有许多这样的操作符可以给你不同类型的比较:

这些是你可以用来进行数值比较的测试条件操作符:

如果你在进行字符串比较,你可以使用以下这些测试条件:

还有些条件用于检查文件类型:

要特别注意空格。开括号和闭括号、条件之间必须有空格。同样地,条件操作符(-le、== 等)之前和之后必须有空格。

8、使用 Bash 脚本中的循环

Bash 支持三种类型的循环:for、while 和 until。

这是 for 循环的一个例子:

#!/bin/bash
for num in {1..10}; do
    echo $num
done

运行它,你将看到以下输出:

如果你选择使用上面的示例,可以使用 while 循环这样重写:
#!/bin/bash
num=1
while [ $num -le 10 ]; do
    echo $num
    num=$(($num+1))
done

同样,可以使用 until 循环来重写:

#!/bin/bash
num=1
until [ $num -gt 10 ]; do
    echo $num
    num=$(($num+1))
done

while 循环和 until 循环非常相似。区别在于:while 循环在条件为真时运行,而 until 循环在条件为假时运行。

9、在 Bash 脚本中使用函数

Bash Shell 支持使用函数,这样你不必反复编写相同的代码片段。

这是声明 Bash 函数的通用语法:

function_name() {
  commands
}

这是一个使用带参数的函数的 Bash 脚本样例:

#!/bin/bash
sum() {
    sum=$(($1+$2))
    echo "The sum of $1 and $2 is: $sum"
}
echo "Let's use the sum function"
sum 1 5

如果你运行该脚本,你将看到以下输出:

Let's use the sum function
The sum of 1 and 5 is: 6

接下来呢?

这只是一个初窥。这个 Bash 脚本教程只是一篇引言。Bash 脚本的内容还有很多,你可以慢慢地、逐渐地探索。



Tags:Bash   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
BASH中如何同时重定向多个命令的输出?
在Bash脚本中,有时我们需要将多个命令的输出同时重定向到文件或日志中。下面介绍几种常见的方法。单个命令的输出重定向对于单个命令的输出重定向,最简单的方式是使用大于符...【详细内容】
2024-01-03  Search: Bash  点击:(114)  评论:(0)  加入收藏
对 Bash 感到厌倦?教你如何在 Linux 中更改默认 Shell
Bash 并不是唯一可供选择的 Shell。还存在数量众多的 Shell,它们都有一些独特的特性,例如 Zsh、Fish、Ksh 和 Xonsh。在你的系统中,你可以同时安装多个 Shell。要想将另一个 Sh...【详细内容】
2023-12-14  Search: Bash  点击:(196)  评论:(0)  加入收藏
Bash 脚本编程入门
初学者们,让我们在这个大型的教程中来认识一下 Bash 脚本编程。Shell 是 Linux 的核心部分,它允许你使用各种诸如 cd、ls、cat 等的命令与 Linux 内核进行交互。Bash 是 Linux...【详细内容】
2023-08-23  Search: Bash  点击:(319)  评论:(0)  加入收藏
Bash 和 Linux 符号与命令的完整指南
在本指南中,我们将探索Linux和Bash符号与命令的广阔世界。从文件系统导航到文本处理、网络、系统管理等,我们将涵盖各种主题,并提供每个命令的实际示例。无论你是经验丰富的Lin...【详细内容】
2023-06-26  Search: Bash  点击:(194)  评论:(0)  加入收藏
Sh、Bash 和 Dash 几种 Shell 的区别是什么?
在调试基于 Debian 的 Docker 镜像时,进入容器后在终端中按上箭头键后终端显示^[[A,下箭头显示^[[B,右箭头显示^[[C,左箭头显示^[[D,按删除键也是显示了几个特殊字符。很奇怪,仔细...【详细内容】
2023-06-11  Search: Bash  点击:(142)  评论:(0)  加入收藏
Linux bash 配色方案 - 记一次成功的 CentOS 终端配色实践
1. 配色方案原理Linux bash 配置分为两部分: 命令提示符,存放在 PS1 环境变量中 文件类型配色方案,存放在 LS_COLORS 环境变量中我们可以通过如下命令来查看它们。# 查看 bash...【详细内容】
2023-04-23  Search: Bash  点击:(963)  评论:(0)  加入收藏
10种有用的Linux Bash_Completion 命令示例
本文分享自华为云社区《有用的 Linux Bash_Completion 命令示例(Steroids 上的 Bash 命令行补全)》,作者:Tiamo_T 。在 Linux 中,在键入命令时,如果按两次 TAB,它将列出所有以键入...【详细内容】
2022-08-18  Search: Bash  点击:(413)  评论:(0)  加入收藏
Xonsh Shell:在 Linux 终端结合 Bash Shell 和 Python 的最佳特性
最受欢迎的 shell 是什么?我猜你会回答 bash 或者 zsh,没错,的确如此。UNIX 和 Linux 系统上有许多可用的 shell,包括 Bash、Ksh、Zsh、Fish 等等。最近,我碰到了另外一个 shell,...【详细内容】
2022-03-25  Search: Bash  点击:(343)  评论:(0)  加入收藏
全宇宙最全的Linux运维bash脚本常见用法总结
删除重复的数组元素创建临时关联数组。设置关联数组 值并发生重复赋值时,bash会覆盖该键。这 允许我们有效地删除数组重复。CAVEAT:需要bash4+示例功能:remove_array_dups() {...【详细内容】
2022-03-18  Search: Bash  点击:(370)  评论:(0)  加入收藏
腾讯程序员干货分享:编写可靠 bash 脚本的五大技巧
写过很多 bash 脚本的人都知道,bash 的坑不是一般的多。 其实 bash 本身并不是一个很严谨的语言,但是很多时候也不得不用。以下总结了一些鹅厂程序员在编写可靠 bash 脚本的一...【详细内容】
2021-04-09  Search: Bash  点击:(458)  评论:(0)  加入收藏
▌简易百科推荐
用于人工智能开发的主流编程语言都有哪些?
在人工智能开发领域,编程语言的选择至关重要。目前,主流的编程语言主要包括Python、Java、C++、JavaScript和Swift等。这些语言各具特色,适用于不同的人工智能开发场景。首先,Py...【详细内容】
2024-01-31    简易百科  Tags:编程语言   点击:(130)  评论:(0)  加入收藏
探究微处理器开发中的汇编语言的优势与挑战
在计算机编程中,汇编语言是一种低级语言,它可以直接控制计算机的硬件资源。与高级语言相比,汇编语言具有更高的运行效率和更好的控制能力,但同时也更加复杂和难以理解和维护。在...【详细内容】
2023-12-19  松鼠宝贝    Tags:汇编语言   点击:(98)  评论:(0)  加入收藏
选择适合微服务的编程语言,让你的工作事半功倍!
讨论编程语言就像是一场政治辩论。每个开发者都会过分捍卫他/她所使用的编程语言。然而,编程语言应该被看作是它们真正是的东西,即一种工作工具。每种编程语言都有特定的目的...【详细内容】
2023-12-14  爱发白日梦的后端  微信公众号  Tags:编程语言   点击:(177)  评论:(0)  加入收藏
编程语言大比拼:Python、Java、C、C++、Go 实现 'Hello World' 和九九乘法表"
应该90%的IT专业的朋友写的第一段代码就是打印"holle world",每个大学老师都会通过这个方式吸引你对课程产生兴趣。也许有的朋友学的是JAVA开发,有的学的是c,在几年前应该很...【详细内容】
2023-12-11  IT仔的笔记本  微信公众号  Tags:编程语言   点击:(216)  评论:(0)  加入收藏
TypeScript中的null和undefined的区别
在TypeScript中,null和undefined是两个特殊的值,用于表示变量的缺失或未定义。尽管它们在某些情况下可能看起来相似,并且都可以表示"没有值",但它们在语义和用法上存在一些重要...【详细内容】
2023-12-07  科学随想录  微信公众号  Tags:TypeScript   点击:(132)  评论:(0)  加入收藏
面向AI开发的六种最重要的编程语言
作者丨FATIH KÜÇÜKKARAKURT 译者 | 布加迪审校 | 重楼出品 | 51CTO技术栈(微信号:blog51cto)在AI开发界,你使用的编程语言很重要。每种语言有其独特...【详细内容】
2023-12-07    51CTO  Tags:编程语言   点击:(121)  评论:(0)  加入收藏
NLP问题实战:基于LSTM(RNN)和Transformer模型
译者 | 朱先忠审校 | 重楼简介GPT等语言模型最近变得非常流行,并被应用于各种文本生成任务,例如在ChatGPT或其他会话人工智能系统中。通常,这些语言模型规模巨大,经常使用超过数...【详细内容】
2023-11-29    51CTO  Tags:NLP   点击:(272)  评论:(0)  加入收藏
一文了解低级和高级编程语言
中文是一种尽量用简短文字表达更多含义的语言,所以很多时候一句话的含义很容易曲解成别的意思。最近,有人提出C语言是一种中级语言的概念,所以特意介绍一下低级语言和高级语言...【详细内容】
2023-11-23  数字随行  微信公众号  Tags:编程语言   点击:(232)  评论:(0)  加入收藏
JetBrains 发布 2023 调研报告:77% 开发者使用 ChatGPT
IT之家 11 月 21 日消息,JetBrains 日前公布了《2023 开发人员生态系统现状》调研报告,汇集了来自全球 26,348 位开发者的调研结果。《开发者生态系统现状报告》涵盖广泛的主...【详细内容】
2023-11-21    IT之家  Tags:JetBrains   点击:(236)  评论:(0)  加入收藏
Go vs Rust:文件上传性能比较
一、设置所有测试都在配备16G内存的 MacBook Pro M1 上执行。软件版本为: Go v1.20.5 Rust v1.70.0测试工具是一个基于 libcurl 并使用标准线程的自定义工具,能够发送多部分请...【详细内容】
2023-11-20  技术的游戏  微信公众号  Tags:Rust   点击:(174)  评论:(0)  加入收藏
站内最新
站内热门
站内头条