Bash Scripting-TryHackMe

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 检查文件是否可写,没有写权限我们将无法将文本输出到文件中。