0 x 001#
什么是 Bash?#
我们一起看看 Bash 的结构,Bash 脚本顶部代码始终以以下代码开头
#!/bin/bash
这样你的 shell 才知道始终在终端里运行
让我们看一些例子:
#!/bin/bash
echo "Hello World!"
这将返回字符串“Hello World”。命令“ ”用于向屏幕输出文本,与 python 中的 echo
“ ”命令相同。print
我建议在终端中对此进行测试以掌握 bash!
还可以在 bash 脚本中执行正常的 Linux 命令,如果格式正确,它将被执行。例如,我们可以在我们的 bash 脚本中运行命令“ls
”,我们将在运行该文件时看到输出。所以让它做到这一点!
我们将以上命令保存并并名为 xxx.sh 以.sh 结尾文件,接着我们输入 chmod +x xxx.sh 赋予可执行权限,运行后我们可以看到以下输出结果。
$ ./test.sh
Hello World
BadWiChell
uid=1000(BadWiChell) gid=1000(BadWiChell) groups=1000(BadWiChell),998(BadWiChell)
0 x 002#
什么是变量?#
在 bash 中我们可以创建变量,例如:
name = BadWiChell
我们将 BadWiChell
分配给变量 name
请注意,要使变量起作用,不能在变量名、“ = ”和值之间留空格。他们不能有空格。
那么我们现在如何使用我们的变量呢?那么它也很简单。
name = BadWiChell
echo $name
为了可以使用变量,我们需加上 $
当然我们也可以在我们终端执行:
$ name="BadWiChell "
$ echo $name
BadWiChell
最后将 BadWiChell 输出到了屏幕
变量使存储数据变得更加容易,而不是在多个地方输入相同的东西,我们可以简单地用 $var 插入我们的变量,然后将其声明为某个值,这样如果做错了什么并且需要时更容易回退改变它。那么我们如何调试我们的代码呢?
调试是编程中非常重要的一部分,因此我们应该尽早习惯解决问题和修复错误。Bash 有一些内置功能,可以让我们的生活变得简单。变量使存储数据变得更加容易,而不是在多个地方输入相同的东西,我们可以简单地用 $var 插入我们的变量,然后将其声明为某个值,这样如果做错了什么并且需要时更容易回退改变它。那么我们如何调试我们的代码呢?
调试是编程中非常重要的一部分,因此我们应该尽早习惯解决问题和修复错误。Bash 有一些内置功能,可以让我们的生活变得简单。
在命令行运行时,可以执行以下操作:
bash -x ./file.sh
你可以制作一个简单的 bash 脚本(现在你知道一些基本的语法)并做出一些完全错误的事情。然后在调试模式下单步执行您的程序,看看它抛出错误时的样子!
这会告诉您哪些线路有效,哪些线路无效。 如果您想在某个点进行调试,您可以插入set -x
脚本并set +x
结束该部分,如下所示:
$ bash +x ./file.sh
+ echo 'Hello World'
Hello World
+ whoami
BadWiChell
+ id
uid=1000(BadWiChell) gid=1000(BadWiChell) groups=1000(BadWiChell),998(wheel)
可以看到它为命令输出+,然后输出该命令执行的内容。如果出现错误,它会在该行输出一个-这可以很容易地发现出错的地方,以便可以修复它们。
0 x 003#
参数#
我们现在来看看 bash 的主要特性之一,那就是使用参数。 我们将首先查看运行文件时使用命令行指定的参数。它们有多种形式,但通常带有“$”前缀,因为参数仍然是变量。
让我们首先声明一个参数,该参数将成为我们运行 bash 脚本时的第一个参数。
name=$1
echo $name
接着我们执行该 bash 文件
$ ./bash.sh alex
alex
我们运行该 bash 文件果然得到了 alex
那么如果我们想要第二个参数呢? 那么这个过程非常简单,我们只需添加一个 $2
而不是 name=$1
$ ./bash.sh alex tony
tony
它会返回 tony
然而,如果我们不想像这样提供它们,而是让我们以更具交互性的方式输入我们的名字,我们可以使用 read
.
#!/bin/bash
echo Enter Your nmae
read name
echo "you are name is $name"
以上的代码片段我们保存为 name.sh 并执行:
$ ./name.sh
Enter Your name
alex
you are name is alex
0 x 004#
数组#
该章节建议大家在 linux 终端下进行完成
数组用于将多条数据存储在一个变量中,然后可以使用索引提取这些数据。最常记为 var[index_position]
.
数组使用索引意味着数组中的每个项目代表一个数字。
数组中的 ['car', 'train', 'bike', 'bus']
每一项都有对应的索引。
所有索引都从位置 0 开始
物品 | 数量 |
---|---|
car | 0 |
train | 1 |
bike | 2 |
bus | 3 |
现在我们已经介绍了这个,让我们在 bash 中创建一个数组。 |
语法如下:
我们有变量名,在我们的例子中是“运输”
然后我们将每个项目包装在括号中,在每个项目之间留一个空格。
transport=('car' 'train' 'bike' 'bus')
然后我们可以像这样回显数组中的所有元素:
echo "${transport[@]}"
您可以在自己的终端中尝试此操作并查看其输出。
其中“@”表示所有参数,环绕它的 [] 指定其索引。
那么如果我们想打印出 item 呢 train
?
我们只需输入:
echo "${transport[1]}"
因为火车在索引位置 1。
如下图:
我们将讨论的最后一件事是我们是否要更改或删除一个元素。如果我们想删除一个元素,我们将使用该 unset
实用程序。
unset transport[1]
这现在删除了该 train
项目,如果我们想要我们可以回显它并看到它确实消失了
现在让我们把它设置成别的东西。我们可以做的:
transport[1]='trainride'
如果我们回显数组然后我们得到:
car trainride bike bus
所以我们成功地换出了数组中的一个元素!我们将讨论的最后一件事是我们是否要更改或删除一个元素。如果我们想删除一个元素,我们将使用该 unset 实用程序。
Unset transport[1]
这现在删除了该 train 项目,如果我们想要我们可以回显它并看到它确实消失了
现在让我们把它设置成别的东西。我们可以做的:
Transport[1]=‘trainride’
如果我们回显数组然后我们得到:
Car trainride bike bus
所以我们成功地换出了数组中的一个元素!
0 x 004#
条件#
我们谈论条件时,它意味着某段代码依赖于满足的条件,这通常由关系运算符确定,例如等于、大于和小于。
我们将制作一个简单的“if”语句来检查一个变量是否等于一个值,我们还将制作一个脚本来检查文件是否存在以及它是否可写,如果存在我们将向该文件写入一条消息,如果不可写,它将删除它并创建一个新的。这里会教很多新东西,所以要注意。
首先,我们将讨论 if 语句的基本语法。
所有 if 语句如下所示:
if [something comparison something eles]
then
something
else
something different
fi
让我们看一个例子:
count=10
if [$count -eq 10]
then
echo "true"
else
echo "false"
fi
If 语句总是使用一对方括号,在 [] 的情况下,我们需要在文本的两边留一个空格(bash 语法)。我们也总是需要结束 if 语句
fi
这里一个变量被声明为 10,在 if 语句的第一行,变量 $count 与整数 10 进行比较。
如果它们相等则输出true,如果它们为 false 则输出false。正如我们所知,10 等于 10,因此它输出 true。
-eq 是一种方法,您也可以使用“=”
我们将例子带入项目中可能更好的理解,我们来做一个经典的猜数字游戏:
#!/bin/bash
value="guessme"
guss=$1
if ["$value" = "$guss"]
then
echo "They are equal"
else
echo "They are not equal"
fi
现在让我们在我们的终端中测试它。
# ./example.sh guessme
"They are equal"
# ./example.sh hi
"They are not equal"
我们可以看到它有效!
随意尝试这些并尝试进行不同的组合并使用不同的运算符。
现在让我们创建另一个脚本,我们将同时使用 2 个条件并回到我们在第一课中学到的概念。
让我们开始。
我们想制作一个脚本,我们将在参数给定的文件上执行。
然后我们检查它是否存在以及它是否具有写权限。如果它有写权限,那么我们向它回显“ **hello ”。**如果它不可访问或不存在,我们将创建该文件并向其回显“hello”。让我们开始!
#!/bin/bash
filename=$1
if [ -f "$filename" ] && [ -w "$filename " ]
then
echo "hello" > $filename
else
touch "$filename"
echo "hello" > $filename
fi
─# ./example.sh hello.txt ─# cat hello.txt
Hello
我们可以看到它起作用了!!
-f 检查文件是否存在。
-w 检查文件是否可写,没有写权限我们将无法将文本输出到文件中。