Redian新闻
>
Bash 脚本编程入门 | Linux 中国

Bash 脚本编程入门 | Linux 中国

科技
 
导读:初学者们,让我们在这个大型的教程中来认识一下 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
◈ 使用 forwhile 和 until 循环
◈ 创建函数

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

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

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

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

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

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

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

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

19 个你应该知道的基础而重要的 Linux 终端技巧🔗 itsfoss.com

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

Linux 中的绝对路径和相对路径有什么不同🔗 linuxhandbook.com

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

终端基础:Linux 终端入门

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 脚本。

Bash 基础知识系列 #1:创建并运行你的第一个 Bash Shell 脚本

2、在 Bash 脚本中使用变量

变量的声明方式如下:

  1. var=some_value

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

  1. $var

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

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

  1. #!/bin/bash
  2. message="Hello World"
  3. echo $message

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

  1. Hello World

Bash 基础知识系列 #2:在 Bash 中使用变量

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

Bash 基础知识系列 #3:传递参数和接受用户输入

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

Bash 基础知识系列 #4:算术运算

5、在 Bash 脚本中使用数组

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

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

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

要访问一个元素,使用:

  1. ${array_name[N]}

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

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

  1. ${array[*]}

这样获取数组长度:

  1. ${#array_name[@]}

Bash 基础知识系列 #5:在 Bash 中使用数组

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

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

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

  1. ${#string}

连接两个字符串:

  1. str3=$str1$str2

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

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

这里有一个例子:

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

  1. ${string/substr1/substr2}

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

  1. ${string/substring}

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

7、在 Bash 中使用条件语句

你可以通过使用 if 或 if-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== 等)之前和之后必须有空格。

Bash 基础知识系列 #7:If-Else 语句

8、使用 Bash 脚本中的循环

Bash 支持三种类型的循环:forwhile 和 until

这是 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 循环在条件为假时运行。

Bash 基础知识系列 #8:For、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 基础知识系列 #9:Bash 中的函数

接下来呢?

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

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

GNU Bash 参考🔗 www.gnu.org

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

下载 Bash 初学者指南🔗 tldp.org

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

下载高级 Bash 编程指南🔗 tldp.org

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

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

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


via: https://itsfoss.com/bash-scripting-tutorial/

作者:Abhishek Prakash 选题:lujun9972 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

欢迎遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “转载:公众号名称”,
我们将为您添加白名单,授权“转载文章时可以修改”。


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
在 Linux 中使用 cd 命令 | Linux 中国5 个专注于隐私保护的 Linux 发行版 | Linux 中国在 Ubuntu、Linux Mint 和 Windows 中升级到最新的 LibreOffice | Linux 中国Linux 中的模糊文件搜索 | Linux 中国Fedora Linux 的家族(二):定制版 | Linux 中国Fedora Linux 的家族(一):官方版本 | Linux 中国Linux 窗口管理器 Compiz 简史 | Linux 中国在 Linux 中使用 cat 命令 | Linux 中国Linux Shell 介绍:Bash、Zsh 和 Fish | Linux 中国宽容我自己40个简单但有效的Linux Shell脚本示例SparkyLinux 7 “Orion Belt” 评测:稳定性与新鲜感的结合 | Linux 中国Linux 版 WhatsApp | Linux 中国你的旧电脑是 “过时” 了,还是使用 Linux 的机会? | Linux 中国为什么黑客更喜欢使用 Kali Linux? | Linux 中国六月 雨来哞~ 我的 Linux 终端里有头牛 | Linux 中国长篇小说《如絮》第一百四十章 旧金山-2005年 病痛修复 Arch Linux 中的 “Bash: man command not found” 错误 | Linux 中国如何在 Linux 主机和 KVM 中的 Windows 客户机之间共享文件夹 | Linux 中国2023 年最佳 Linux 视频编辑软件 | Linux 中国在 Linux 中使用 cp 命令 | Linux 中国清平乐:人间正道如山探索 Shell 脚本的威力 | Linux 中国Fedora Linux 的家族(三):实验室 | Linux 中国适用于 Linux 的 5 个最佳 PDF 编辑器 | Linux 中国Linux 中退出码的含义 | Linux 中国10 分钟让你了解 Linux ABI | Linux 中国沧浪池将 Linux 终端与 Nautilus 文件管理器结合起来 | Linux 中国10 个最好的 Xfce 桌面环境的 Linux 发行版 | Linux 中国你好,我是筚(bì)篥( lì)!终端基础:在 Linux 中复制文件和目录 | Linux 中国Ubuntu Linux 的 7 个最佳应用坞 | Linux 中国开源朗读者 | Linux 只是一个内核:这是什么意思? | Linux 中国
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。