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的时候会用到。