bash

参数变量:

$# 此变量保存传递给脚本的参数数。
$@ 此变量可用于检索命令行参数列表。
$n 可以使用其位置有选择地检索每个命令行参数。例如,第一个参数位于 。$1
$$ 当前正在执行的进程的进程 ID。
$? 脚本的退出状态。此变量可用于确定命令是否成功。值 0 表示成功执行,而值 1 表示失败的结果。
$# 在这种情况下,我们只需要一个需要分配给该变量的变量。此变量用于指定我们要使用的目标。如果我们只提供一个 FQDN 作为参数,则该变量的值为 .domain``$#``1
$0 此特殊变量被分配执行脚本的名称,然后在 “” 示例中显示。Usage:
$1 用空格分隔,第一个参数分配给该特殊变量。

引号的区别:

在Bash中,""(双引号)和 ''(单引号)是用于引用字符串的两种不同方式,它们有以下区别:

  1. 处理变量和命令替换:
    • "":双引号允许变量展开(即替换为变量的值)和命令替换(即替换为命令的输出结果)。例如,"$var"将展开为变量var的值。
    • '':单引号将字符串视为字面值,不进行变量展开或命令替换。例如,'$var'将被视为字面字符串$var,而不是变量展开。
  2. 处理特殊字符的转义:
    • "":双引号可以使用反斜杠\来转义某些特殊字符,如\"(双引号)、\\(反斜杠)等。这样,特殊字符将被视为普通字符,而不具有其特殊含义。
    • '':单引号内的字符串将被视为纯文本,不进行特殊字符的转义。即使特殊字符(如反斜杠和双引号)也将被视为字面值。
var="world"

echo "Hello $var"     # 输出:Hello world

echo 'Hello var'     # 输出:Hello var

echo "I have $10"    # 输出:I have $10

echo 'I have 10'     # 输出:I have 10

echo "Path: $HOME"    # 输出:Path: /home/username

echo 'Path: HOME'    # 输出:Path: HOME

echo "Quotes: \"\'"   # 输出:Quotes: "'"

echo 'Quotes: "\'\''" # 输出:Quotes: "\'"

==分配变量时,名称和值之间不得有空格。==

需要注意的是,单引号 (…) 和双引号 ( … ) 可防止数组中各个值之间的空格分隔。这意味着==单引号和双引号之间的所有空格都将被忽略==,并作为分配给数组的单个值进行处理。

数组:

示例代码 domains=(www.inlanefreight.com ftp.inlanefreight.com vpn.inlanefreight.com www2.inlanefreight.com) 是一种有效的方式来创建名为 domains 的数组,并将指定的字符串元素分配给数组的各个索引位置。

在这个例子中,domains 数组包含了四个元素,分别是 "www.inlanefreight.com", "ftp.inlanefreight.com", "vpn.inlanefreight.com", 和 "www2.inlanefreight.com"

你可以通过使用索引来访问和操作数组的元素。例如:

echo ${domains[0]}  # 输出:www.inlanefreight.com
echo ${domains[2]}  # 输出:vpn.inlanefreight.com

domains[1]="newdomain.com"  # 修改索引为1的元素

echo ${domains[@]}  # 输出整个数组内容

字符串运算符:

== 等于
!= 不等于
< 小于 ASCII 字母顺序
> 大于 ASCII 字母顺序
-z 如果字符串为空 (null)
-n 如果字符串不为空

这里需要注意的是,我们将给定参数的变量放在双引号中。这告诉 Bash 变量的内容应该作为字符串处理。否则,我们会得到一个错误。

字符串比较运算符 “/” 只在双方括号内工作。我们可以在互联网上或通过在终端中使用以下命令找到 ASCII 表。我们稍后看一个例子。<``>``[[ <condition> ]]

关于括号

在 Bash 中,(( )) 是一种用于进行算术运算和数值比较的特殊结构。

双括号 (( )) 的主要作用是将其内部的内容解释为算术表达式。它可以执行数值的增减操作、比较运算等。

对于 ((stat--)),它是一个自减运算的表达式。它将变量 stat 的值减 1,并将结果赋值给 stat 变量本身。

请注意,双括号 (( )) 中的表达式不需要使用 $ 符号来引用变量。

以下是一个示例:

stat=5
((stat--))
echo $stat  # 输出: 4

上述示例中,stat 的初始值为 5。((stat--)) 表达式将 stat 的值减 1,结果为 4。然后,使用 echo 打印变量 stat 的值,输出为 4。

双括号 (( )) 还支持其他算术运算,例如加法、乘法、除法等,以及数值比较操作。它提供了更强大的算术操作能力,相比于单括号 []test 命令更方便和灵活。

在 Bash 中,单括号 [] 是用于条件测试的一种结构。它可以用于判断表达式的真假,并根据结果进行条件判断。

以下是单括号 [] 的几种常见用法:

  1. 条件判断:[ expression ] 或者 test expression

    单括号中的 expression 是一个条件表达式,可以包含变量、比较运算符、逻辑运算符等。条件表达式的结果为真时,返回状态码 0;为假时,返回非零状态码。

if [ $var -eq 10 ]; then
    echo "Variable is equal to 10"
fi
  1. 字符串比较:[ string1 operator string2 ]

单括号中的字符串比较用于判断两个字符串之间的关系,常见的操作符包括 -eq(相等)、!=(不相等)、-z(为空字符串)、-n(非空字符串)等。

示例:

if [ "$str1" = "$str2" ]; then
    echo "Strings are equal"
fi
  1. 文件测试:[ -<option> file ]

单括号中的文件测试用于检查文件的属性或状态,常见的选项包括 -f(判断是否为常规文件)、-d(判断是否为目录)、-r(判断是否可读)等。

示例:

if [ -f "$filename" ]; then
    echo "File exists and is a regular file"
fi

需要注意的是,单括号 [] 是一种命令结构,它将条件表达式作为命令的参数。在条件判断中,变量应该使用双引号引起来,以防止由于变量为空或包含空格等特殊字符而引发错误。

另外,与双括号 (( )) 不同,单括号 [] 不支持算术运算,它主要用于条件判断和文件测试。

${ #htb}可以统计字符串字数

文件运算符:

-e 如果文件存在
-f 测试它是否为文件
-d 测试它是否是目录
-L 测试是否为符号链接
-N 检查文件在上次读取后是否被修改
-O 如果当前用户拥有该文件
-G 如果文件的组 ID 与当前用户的组 ID 匹配
-s 测试文件大小是否大于 0
-r 测试文件是否具有读取权限
-w 测试文件是否具有写入权限
-x 测试文件是否具有执行权限

示例:查看文件是否存在

#!/bin/bash

# Check if the specified file exists
if [ -e "$1" ]
then
    echo -e "The file exists."
    exit 0

else
    echo -e "The file does not exist."
    exit 2
fi

逻辑运算符

! 逻辑否定不是
&& 逻辑和
`

关于=~

在 Bash 中,`=~` 是一个用于正则表达式匹配的操作符。它用于将一个字符串与一个正则表达式进行匹配。

语法为:

[[ string =~ regex ]]

其中 string 是要匹配的字符串,regex 是正则表达式模式。

当使用 =~ 进行匹配时,如果 string 符合 regex 的模式,条件将为真;否则,条件将为假。

这个操作符通常用于条件语句,例如 if 语句中,用于检查字符串是否符合特定的正则表达式模式。

以下是一个示例:

string="Hello, world!"

if [[ $string =~ o,.*ld! ]]; then
    echo "Matched!"
else
    echo "Not matched!"
fi

上述示例中,如果 string 匹配了模式 o,.*ld!,则条件为真,将输出 “Matched!”。否则,将输出 “Not matched!”。

重定向

在 Bash 中,文件描述符是用于标识不同类型的输入/输出流的整数。常见的文件描述符有以下几种:
  • 0: 标准输入(stdin)
  • 1: 标准输出(stdout)
  • 2: 标准错误(stderr)

使用 >< 进行重定向时,默认情况下会操作标准输出。但是,当使用 & 将数字与 >< 结合使用时,它会告诉 Bash 这是一个文件描述符,而不是普通的输入/输出操作符。

因此,2>&1 将标准错误的文件描述符 2> 结合,指示 Bash 将标准错误重定向到其前面的文件描述符 1,即标准输出。

这种语法允许将标准错误输出合并到标准输出中,以便统一处理和重定向这两个流的内容。

在 Bash 中,2>&1 是一种重定向语法,用于将标准错误(标识符为2)重定向到标准输出。

具体来说,2 表示标准错误的文件描述符,1 表示标准输出的文件描述符。> 符号用于将输出重定向到指定的文件描述符。

因此,2>&1 将标准错误重定向到标准输出,意味着标准错误的输出将与标准输出一起显示。

以下是一些示例说明:

  • command 2>&1:将 command 命令的标准错误输出合并到标准输出中。
  • command > output.txt 2>&1:将 command 命令的标准输出和标准错误输出都重定向到 output.txt 文件中。

这种重定向语法常用于捕获和处理命令的错误消息,以及将标准输出和标准错误输出一起保存到日志文件中。

需要注意的是,2>&1 中的空格很重要,确保它们位于 2>1 之间,以及 & 符号前后,以正确指定重定向操作。

返回值

1 一般错误
2 滥用外壳内置
126 调用的命令无法执行
127 找不到命令
128 退出的参数无效
128+n 致命错误信号”n
130 脚本由 Control-C 终止
255\* 退出状态超出范围

2>&1

在 Bash 中,2>&1 是一种重定向语法,用于将标准错误(标识符为2)重定向到标准输出。

具体来说,2 表示标准错误的文件描述符,1 表示标准输出的文件描述符。> 符号用于将输出重定向到指定的文件描述符。

因此,2>&1 将标准错误重定向到标准输出,意味着标准错误的输出将与标准输出一起显示。

以下是一些示例说明:

  • command 2>&1:将 command 命令的标准错误输出合并到标准输出中。
  • command > output.txt 2>&1:将 command 命令的标准输出和标准错误输出都重定向到 output.txt 文件中。

这种重定向语法常用于捕获和处理命令的错误消息,以及将标准输出和标准错误输出一起保存到日志文件中。

需要注意的是,2>&1 中的空格很重要,确保它们位于 2>1 之间,以及 & 符号前后,以正确指定重定向操作。

&在这里的含义是什么

ChatGPT

2>&1 中,& 的含义是将其前面的数字 2 解释为文件描述符而不是普通的字符。

在 Bash 中,文件描述符是用于标识不同类型的输入/输出流的整数。常见的文件描述符有以下几种:

  • 0: 标准输入(stdin)
  • 1: 标准输出(stdout)
  • 2: 标准错误(stderr)

使用 >< 进行重定向时,默认情况下会操作标准输出。但是,当使用 & 将数字与 >< 结合使用时,它会告诉 Bash 这是一个文件描述符,而不是普通的输入/输出操作符。

因此,2>&1 将标准错误的文件描述符 2> 结合,指示 Bash 将标准错误重定向到其前面的文件描述符 1,即标准输出。

这种语法允许将标准错误输出合并到标准输出中,以便统一处理和重定向这两个流的内容。

这在我们反弹shell的时候会用到。