这些字多是夜里写的,说给自己听。白天想不通的事,写到纸上才慢慢理顺;一篇篇攒下来,攒得久了,就成了这趟夜航。
参数、变量与数组
参数 核心机制: 执行 ./script.sh ARG1 ARG2 ... ARG9 时,shell 自动把参数塞进预定义好的特殊变量: $0=script.sh $1=ARG1 ... $9=ARG9 最多 9 个 ($0 被脚本名占了) 参数靠 IFS(Internal Field Separator, 默认空格)切分——“哪个字符结束一个参数、开始下一个”由它决定 注意: 严格说 bash 能接收超过9个参数,但第10个起需要写 ${10} (花括号,否则 $10 会被解析成 $1 后面跟个0) 特殊变量 变量 含义 $# 参数个数 $@ 全部参数的列表 $n 第 n 个参数 $$ 当前进程的 PID $? 上一条命令的退出码 变量 三条铁律: ...
条件执行
条件执行让你“命中哪个条件就只跑哪段代码,其余跳过;跑完这段,再回到条件外面继续”。 条件执行的两种形式 if-else 家族 case 语句 Shebang 在脚本的第一行,以#! 开头,后面跟解释器的路径。 决定以./script.sh 方式执行时,内核去找谁解释这个文件。 不止 bash 能用,Python/Perl 也行: #!/usr/bin/env python #!/usr/bin/env perl (/usr/bin/env 表示“去环境变量 PATH 里找”) if 家族语法骨架 if [ condition ] # 只有 if then ... fi if [ condition ] # if + else then ... else ... fi if [ condition ] # if + elif + else (elif 可以写多个) then ... elif [ condtion ] then ... else ... fi 命令速查表 命令/ 符号 作用 例子 if / elif / else / fi 条件分支判断:if(如果)、elif(否则如果)、else(否则),最后以倒写 fi 闭合结束。 if [ $# -eq 0 ] then 条件触发标志:配合 if 或 elif 使用,紧跟在条件表达式后,表示“当条件成立时执行以下代码”。 if [ $stat -eq 1 ]; then -gt 数值比较:大于(Greater Than) if [ $hosts_total -gt 0 ] {1..40} 生成连续序列(Brace Expansion):自动展开为 1 到 40 的连续数字,常用于循环。 for i in {1..40}; do echo $i; done wc 文本统计工具(Word Count):用于统计行数(-l)、词数(-w)或字节/字符数(-c)。 cat discovered_hosts.txt | wc -l base64 Base64 编码/解码工具:默认编码输入流,加上 -d 参数用于反向解码。 编码:echo -n "secret" | base64 解码:echo "c2VjcmV0" | base64 -d /usr/bin/env 动态解析解释器路径:常用于脚本首行 Shebang(#!)。在当前用户的 $PATH 路径中查找指定程序,提高脚本在不同 Linux/Unix 发行版间的跨平台移植性(避免硬编码 /bin/bash 导致不同系统路径找不到报错)。 #!/usr/bin/env bash base64 -w 设置输出自动换行列数(通常配合 0 使用,即 -w 0 或 -w0) GNU base64 默认每 76 字符插一个换行符,加 -w 0 可以禁用换行,将所有编码结果输出在同一行。 echo -n “secret” | base64 -w 0 echo -n 取消末尾换行符:默认 echo 输出完内容后会自动在末尾加上一个换行符(\n)。使用 -n 可以防止输出结尾换行。 echo -n “my_password” 练习 #!/bin/bash # Count number of characters in a variable: # echo $variable | wc -m # Variable to encode var="nef892na9s1p9asn2aJs71nIsm" for counter in {1..40}; do var=$(echo $var | base64) done echo $var | wc -m 注意 #!/bin/bash value=$1 if [ $value -gt "10" ] then echo "Given argument is greater than 10." elif [ $value -lt "10" ] then echo "Given argument is less than 10." else echo "Given argument is not a number." fi ---- # 返回 bash if-elif-else.sh HTB if-elif-else.sh: line 5: [: HTB: integer expression expected if-elif-else.sh: line 8: [: HTB: integer expression expected Given argument is not a number. [ $value -gt “10” ] 拿非数字去比,test 命令报错并返回非 0(不 crash,只算"条件为假"), 报错但不崩溃 → 落入 else 兜底(bash 没有类型)。
Bash 是什么?
Bash 是 Unix 系系统的脚本语言,用来和系统“对话”、下命令。 脚本语言 VS. 编程语言 一句话:脚本语言写完就能跑,编程语言写完需要先编译。 存在三种执行方式 bash script.sh <可选参数> # 显示指定解释器 bash sh script.sh <可选参数> # 指定 sh (bash 的兼容模式) ./script.sh <可选参数> # 直接执行,靠文件第一行 #!/bin/bash 指定解释器 前两种只需要r权限,第三种需要rx权限。 因为第三种是将脚本当作可执行二进制文件处理;而前两种是脚本作为参数让系统使用解释器执行。 ...