bash
参数变量:
$# | 
此变量保存传递给脚本的参数数。 | 
|---|---|
$@ | 
此变量可用于检索命令行参数列表。 | 
$n | 
可以使用其位置有选择地检索每个命令行参数。例如,第一个参数位于 。$1 | 
$$ | 
当前正在执行的进程的进程 ID。 | 
$? | 
脚本的退出状态。此变量可用于确定命令是否成功。值 0 表示成功执行,而值 1 表示失败的结果。 | 
$# | 
在这种情况下,我们只需要一个需要分配给该变量的变量。此变量用于指定我们要使用的目标。如果我们只提供一个 FQDN 作为参数,则该变量的值为 .domain``$#``1 | 
|---|---|
$0 | 
此特殊变量被分配执行脚本的名称,然后在 “” 示例中显示。Usage: | 
$1 | 
用空格分隔,第一个参数分配给该特殊变量。 | 
引号的区别:
在Bash中,""(双引号)和 ''(单引号)是用于引用字符串的两种不同方式,它们有以下区别:
- 处理变量和命令替换:
"":双引号允许变量展开(即替换为变量的值)和命令替换(即替换为命令的输出结果)。例如,"$var"将展开为变量var的值。'':单引号将字符串视为字面值,不进行变量展开或命令替换。例如,'$var'将被视为字面字符串$var,而不是变量展开。
 - 处理特殊字符的转义:
"":双引号可以使用反斜杠\来转义某些特殊字符,如\"(双引号)、\\(反斜杠)等。这样,特殊字符将被视为普通字符,而不具有其特殊含义。'':单引号内的字符串将被视为纯文本,不进行特殊字符的转义。即使特殊字符(如反斜杠和双引号)也将被视为字面值。
 
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 中,单括号 [] 是用于条件测试的一种结构。它可以用于判断表达式的真假,并根据结果进行条件判断。
以下是单括号 [] 的几种常见用法:
条件判断:
[ expression ]或者test expression单括号中的
expression是一个条件表达式,可以包含变量、比较运算符、逻辑运算符等。条件表达式的结果为真时,返回状态码 0;为假时,返回非零状态码。
if [ $var -eq 10 ]; then
    echo "Variable is equal to 10"
fi
- 字符串比较:
[ string1 operator string2 ] 
单括号中的字符串比较用于判断两个字符串之间的关系,常见的操作符包括 -eq(相等)、!=(不相等)、-z(为空字符串)、-n(非空字符串)等。
示例:
if [ "$str1" = "$str2" ]; then
    echo "Strings are equal"
fi
- 文件测试:
[ -<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的时候会用到。