网易首页 > 网易号 > 正文 申请入驻

Bash 脚本编程入门 | Linux 中国

0
分享至

导读:初学者们,让我们在这个大型的教程中来认识一下 Bash 脚本编程。

本文字数:8039,阅读时长大约: 10分钟

https://linux.cn/article-16120-1.html
作者:Abhishek Prakash
译者:ChatGPT


初学者们,让我们在这个大型的教程中来认识一下 Bash 脚本编程。

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

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

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

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

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

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

  1. $ echo "hello world"

  2. hello world

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

  1. $ cat >> script.sh

  2. #!/bin/bash

  3. echo "hello world"

  4. $ bash script.sh

  5. hello world

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

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

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

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

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

  1. #!/bin/bash

  2. if [ $(whoami) = 'root' ]; then

  3. echo "You are root"

  4. else

  5. echo "You are not root"

  6. fi

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

你将会学到什么?

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

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

◈ 使用变量

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

◈ 进行数学计算

◈ 操作字符串

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

◈ 使用forwhileuntil循环

◈ 创建函数


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

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

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

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

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

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

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

如果你对 Linux 命令行完全不熟悉,我建议你先掌握基础知识。

itsfoss.com

你应该了解如何在命令行中进入特定的位置。为了做到这一点,你需要理解 Linux 文件系统中的路径是如何工作的。

linuxhandbook.com

接下来,这个教程系列会给你介绍目录导航和文件操作的基本知识。

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

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

  1. nano hello.sh

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

  1. #!/bin/bash

  2. echo "Hello World"

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

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

  1. bash hello.sh

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

  1. Hello World

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

  1. chmod u+x hello.sh

然后这样运行它:

  1. ./hello.sh

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

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

2、在 Bash 脚本中使用变量

变量的声明方式如下:

  1. var=some_value

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

  1. $var

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

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

  1. #!/bin/bash

  2. message="Hello World"

  3. echo $message

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

  1. Hello World

3、向 Bash 脚本传递参数

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

  1. ./my_script.sh arg1 arg2

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

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

  1. #!/bin/bash

  2. echo "Script name is: $0"

  3. echo "First argument is: $1"

  4. echo "Second argument is: $2"

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

  1. $ ./argument.sh abhishek prakash

  2. Script name is: ./argument.sh

  3. First argument is: abhishek

  4. Second argument is: prakash

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

< 如显示不全,请左右滑动 >


特殊变量 描述$0脚本名称$1$2$9脚本参数${n}10 到 255 的脚本参数参数数量所有参数一起当前 shell 的进程 id最后执行命令的进程 id最后执行命令的退出状态

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

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

  1. #!/bin/bash

  2. echo "What is your name, stranger?"

  3. read name

  4. read -p "What's your full name, $name? " full_name

  5. echo "Welcome, $full_name"

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

  1. $ ./argument.sh

  2. What is your name, stranger?

  3. abhishek

  4. What's your full name, abhishek? abhishek prakash

  5. Welcome, abhishek prakash

4、执行算术运算

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

  1. $((arithmetic_operation))

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

< 如显示不全,请左右滑动 >


操作符 描述加法减法乘法整数除法(没有小数)模运算(只余)指数(a 的 b 次方)

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

  1. #!/bin/bash

  2. read -p "Enter first number: " num1

  3. read -p "Enter second number: " num2

  4. sum=$(($num1+$num2))

  5. sub=$(($num1-$num2))

  6. echo "The summation of $num1 and $num2 is $sum"

  7. echo "The substraction of $num2 from $num1 is $sub"

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

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

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

  1. #!/bin/bash

  2. num1=50

  3. num2=6

  4. result=$(echo "$num1/$num2" | bc -l)

  5. echo "The result is $result"

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

  1. The result is 8.33333333333333333333

5、在 Bash 脚本中使用数组

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

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

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

要访问一个元素,使用:

  1. ${array_name[N]}

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

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

  1. ${array[*]}

这样获取数组长度:

  1. ${#array_name[@]}

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

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

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

  1. ${#string}

连接两个字符串:

  1. str3=$str1$str2

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

  1. ${string:$pos:$len}

这里有一个例子:

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

  1. ${string/substr1/substr2}

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

  1. ${string/substring}

7、在 Bash 中使用条件语句

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

单个if语句的语法是:

  1. if [ condition ]; then

  2. your code

  3. fi

注意使用[ ... ];then

if-else语句的语法是:

  1. if [ expression ]; then

  2. ## execute this block if condition is true else go to next

  3. elif [ expression ]; then

  4. ## execute this block if condition is true else go to next

  5. else

  6. ## if none of the above conditions are true, execute this block

  7. fi

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

  1. #!/bin/bash

  2. read -p "Enter the number: " num

  3. mod=$(($num%2))

  4. if [ $mod -eq 0 ]; then

  5. echo "Number $num is even"

  6. else

  7. echo "Number $num is odd"

  8. fi

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

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

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

< 如显示不全,请左右滑动 >


条件 当...时,等同于 true$a -lt $b$a < $b$a是小于$b$a -gt $b$a > $b$a是大于$b$a -le $b$a <= $b$a是小于或等于$b$a -ge $b$a >= $b$a是大于或等于$b$a -eq $b$a == $b$a等于$b$a -ne $b$a != $b$a不等于$b

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

< 如显示不全,请左右滑动 >


条件 当...时,等同于 true"$a" = "$b"$a等同于$b"$a" == "$b"$a等同于$b"$a" != "$b"$a不同于$b-z "$a"$a是空的

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

< 如显示不全,请左右滑动 >


条件 当...时,等同于 true-f $a$a是一个文件-d $a$a是一个目录-L $a$a是一个链接


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

8、使用 Bash 脚本中的循环

Bash 支持三种类型的循环:forwhileuntil

这是for循环的一个例子:

  1. #!/bin/bash

  2. for num in {1..10}; do

  3. echo $num

  4. done

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

  1. 1

  2. 2

  3. 3

  4. 4

  5. 5

  6. 6

  7. 7

  8. 8

  9. 9

  10. 10

如果你选择使用上面的示例,可以使用while循环这样重写:

  1. #!/bin/bash

  2. num=1

  3. while [ $num -le 10 ]; do

  4. echo $num

  5. num=$(($num+1))

  6. done

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

  1. #!/bin/bash

  2. num=1

  3. until [ $num -gt 10 ]; do

  4. echo $num

  5. num=$(($num+1))

  6. done

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

9、在 Bash 脚本中使用函数

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

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

  1. function_name() {

  2. commands

  3. }

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

  1. #!/bin/bash

  2. sum() {

  3. sum=$(($1+$2))

  4. echo "The sum of $1 and $2 is: $sum"

  5. }

  6. echo "Let's use the sum function"

  7. sum 1 5

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

  1. Let's use the sum function

  2. The sum of 1 and 5 is: 6

接下来呢?

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

GNU Bash 参考是一份优秀的在线资源,可以解答你的 Bash 疑问。

www.gnu.org

除此之外,你可以下载这本免费书籍来学习更多在此未涵盖的 Bash 内容:

tldp.org

一旦你具有足够的 Bash 基础知识,你可以通过这本免费书籍来学习高级 Bash 脚本:

tldp.org

这两本书至少都有十年的历史,但你仍然可以使用它们来学习 Bash。

希望你喜欢这个作为学习 Bash 脚本起点的教程。请在评论区提供你的反馈。

(题图:MJ/98f47121-7426-4297-9242-8683ccf0496d)

via:

作者: 选题: 译者:ChatGPT 校对:

本文由 原创编译, 荣誉推出

欢迎遵照 CC-BY-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,

我们将为您添加白名单,授权“ 转载文章时可以修改”。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
越闹越大!官方紧急通告,涉事人员全部停职,司机被喷辣椒水不冤

越闹越大!官方紧急通告,涉事人员全部停职,司机被喷辣椒水不冤

乐阳聊军事
2024-06-15 18:34:44
普京、泽连斯基、拜登、北约都毫无退让,政治赌徒已走到红眼了…

普京、泽连斯基、拜登、北约都毫无退让,政治赌徒已走到红眼了…

侦姐有料
2024-06-15 17:54:45
臭名在外,人人喊打!

臭名在外,人人喊打!

凡事一定有办法13119
2024-06-15 14:56:00
为什么我国不拆开英伟达显卡研究,造出自己的国产显卡?

为什么我国不拆开英伟达显卡研究,造出自己的国产显卡?

鹅毛的大雪
2024-06-16 07:32:28
再见曼城!1.2亿标王挂牌出售!顶撞瓜帅,不道歉,或转投大巴黎

再见曼城!1.2亿标王挂牌出售!顶撞瓜帅,不道歉,或转投大巴黎

阿泰希特
2024-06-16 11:34:34
新型卖淫方式,让人预想不到,但却真实存在!

新型卖淫方式,让人预想不到,但却真实存在!

雪影的情感
2023-11-18 11:51:16
数学天才姜萍成绩被质疑,多位大佬发声:开卷考试又如何

数学天才姜萍成绩被质疑,多位大佬发声:开卷考试又如何

娱乐的硬糖吖
2024-06-16 00:36:43
母女情深!凯特暖心安慰9岁夏洛特,公主也在尽力支持生病的妈妈

母女情深!凯特暖心安慰9岁夏洛特,公主也在尽力支持生病的妈妈

译言
2024-06-16 10:37:22
官方回应:他俩均已离婚!

官方回应:他俩均已离婚!

沈阳地铁第一时间
2024-06-15 13:16:10
回顾:21岁美女大学生,洗完澡后没穿内裤,惨遭47岁合租男子侵害

回顾:21岁美女大学生,洗完澡后没穿内裤,惨遭47岁合租男子侵害

百事所谈汇
2024-06-16 05:50:00
银行80后女员工表白60后副行长,不能只看到“恋爱自由”

银行80后女员工表白60后副行长,不能只看到“恋爱自由”

极目新闻
2024-06-16 11:59:03
开蒸!湖北连发28条高温预警,局地还有中到大雨

开蒸!湖北连发28条高温预警,局地还有中到大雨

极目新闻
2024-06-16 10:40:25
成都计划到2027年累计淘汰老旧汽车30万辆

成都计划到2027年累计淘汰老旧汽车30万辆

北青网-北京青年报
2024-06-13 17:29:04
笑麻了!古天乐被爆欠债830万港币!网友的评论让我笑到肚子疼。

笑麻了!古天乐被爆欠债830万港币!网友的评论让我笑到肚子疼。

娱记掌门
2024-06-15 06:10:59
回顾浙江男子偷窥女士洗澡坠亡,家属索赔88.9万,法院判决赢赞许

回顾浙江男子偷窥女士洗澡坠亡,家属索赔88.9万,法院判决赢赞许

五月读书汇
2024-06-16 08:05:23
又破纪录!总决赛G5门票预估收入曝光,数字惊人,绿军赚麻了

又破纪录!总决赛G5门票预估收入曝光,数字惊人,绿军赚麻了

体坛正中心
2024-06-16 11:20:06
当务之急是救山东经济和东北经济,事实是什么?

当务之急是救山东经济和东北经济,事实是什么?

创作者朱海平
2024-06-15 07:52:33
惊!河南3000万买五万吨水,高尔夫球场竟然耗水4000万吨?

惊!河南3000万买五万吨水,高尔夫球场竟然耗水4000万吨?

小毅讲历史
2024-06-15 05:31:15
吕迪格回应定妆照争议手势:很多球员摆出这个姿势,没有宗教意涵

吕迪格回应定妆照争议手势:很多球员摆出这个姿势,没有宗教意涵

直播吧
2024-06-16 06:45:07
被玩烂了的表白弄得魂不守舍,冉副行长,人才啊​!

被玩烂了的表白弄得魂不守舍,冉副行长,人才啊​!

宾语观世
2024-06-15 11:56:09
2024-06-16 14:00:49
Linux
Linux
Linux 中国开源社区
8016文章数 73123关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

上海一家三口出动去香港过周末 在高铁动卧睡一晚就到

头条要闻

上海一家三口出动去香港过周末 在高铁动卧睡一晚就到

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

手机
艺术
房产
数码
军事航空

手机要闻

华为Pura 70系列推送鸿蒙OS 4.2 167版升级:优化相机 拍月亮更强

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

房产要闻

万华对面!海口今年首宗超百亩宅地,重磅挂出!

数码要闻

优派 XG323-4K-OLED-2 显示器预告:原生 10bit、全功能 Type-C

军事要闻

普京提停火和谈条件 美防长迅速回应

无障碍浏览 进入关怀版