Bash 速查表#
1. 基础命令#
1.1. Bash set 选项#
| 选项 | 说明 |
|---|---|
| -e | 在有错误时退出 |
| -n | 读一遍脚本中的命令但不执行,用于检查脚本中的语法错误 |
| -v | 一边执行脚本,一边将执行过的脚本命令打印到标准错误输出 |
| -x | 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来 |
1.2. 条件判断#
1.2.1. 字符串#
| 条件 | 说明 |
|---|---|
[[ -z "$STR" ]] | 字符串为空 |
[[ -n "$STR" ]] | 字符串非空 |
[[ "$STR1" == "$STR2" ]] | 字符串相等 |
[[ "$STR1" != "$STR2" ]] | 字符串不相等 |
[[ "$STR1" == *"$STR2"* ]] | 字符串包含子字符串 |
1.2.2. 数字#
| 条件 | 说明 |
|---|---|
[[ NUM1 -eq NUM2 ]] | NUM1 等于 NUM2 |
[[ NUM1 -ne NUM2 ]] | NUM1 不等于 NUM2 |
[[ NUM1 -lt NUM2 ]] | NUM1 小于 NUM2 |
[[ NUM1 -le NUM2 ]] | NUM1 小于等于 NUM2 |
[[ NUM1 -gt NUM2 ]] | NUM1 大于 NUM2 |
[[ NUM1 -ge NUM2 ]] | NUM1 大于等于 NUM2 |
1.2.3. 文件#
| 条件 | 说明 |
|---|---|
[[ -f FILE ]] | 文件存在 |
[[ -d FILE ]] | 目录存在 |
[[ -e FILE ]] | 文件或目录存在 |
[[ -h FILE ]] | 文件是符号链接 |
[[ -r FILE ]] | 文件可读 |
[[ -w FILE ]] | 文件可写 |
[[ -x FILE ]] | 文件可执行 |
[[ -s FILE ]] | 文件尺寸大于 0 |
1.3. 位置参数#
| 变量 | 说明 |
|---|---|
$@ | 所有位置参数,每个参数作为独立的参数传递。 |
$* | 所有位置参数合并为一个单词,由 IFS 的第一个字符分隔(通常为空格)。 |
$# | 位置参数数量 |
1.4. 退出状态#
| 返回值 | 说明 |
|---|---|
| 0 | 成功 |
| 126 | 找到命令但不可执行 |
| 127 | 没有找到该命令 |
| 128+N | 被编号为 N 的信号终止 |
2. 代码片段#
2.1. 获取脚本所在路径#
# 脚本所在路径
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
# 脚本所在路径的父路径
PARENT_DIR=$(dirname "${SCRIPT_DIR}")2.2. 逐行处理输出#
2.2.1. 逐行处理文件#
while IFS= read -r line; do
echo "${line}"
done <FILENAME如果不添加 IFS=,读到的 line 会删除行首和行尾的 IFS 空白字符(默认是空格和制表符),保留中间空白。
例如对于以下字符串:
line 1
line 2
line 3- 如果不添加
IFS=,获取到的字符串是line 1、line 2、line 3; - 如果添加
IFS=,获取到的字符串是line 1、line 2、line 3。
2.2.2. 逐行处理命令输出#
while IFS= read -r line; do
echo "${line}"
done < <(ls -l)2.2.3. 逐行处理变量内容#
sometext=$(ls -l)
while IFS= read -r line; do
echo "${line}"
done <<<"${sometext}"2.3. 打印连续数字#
# 打印数字 1 到 10
echo {1..10}
# 打印等宽的数字 01 到 10
echo {01..10}2.4. Find#
2.4.1. 找出大于某个大小的文件#
find . -type f -size +100M
find . -type f -size +100M -printf "%k KB %p\n" | sort -rnk 12.4.2. 找出并且打印文件大小#
find . -name '*.txt' -exec ls -lh {} +
find . -name '*.txt' -printf "%p %k KB\n"3. 常用操作#
3.1. 比较两个目录#
diff --brief --recursive dir1 dir23.2. 输出格式化#
3.2.1. 改变输出的 tab 大小#
expand -t4 <FILE>3.2.2. 将输出按表格输出#
echo STRING | column -t3.3. 用户管理#
3.3.1. 设置执行 sudo 不需要密码#
新建文件 /etc/sudoers.d/YOURUSERNAME,内容如下:
YOURUSERNAME ALL=(ALL) NOPASSWD: ALL你也可以选择将其追加到 /etc/sudoers 文件中。
3.3.2. 在多次错误输入后用户被锁定#
可以修改文件 /etc/security/faillock.conf 来改变用户允许输入密码错误的次数。
找到以下行:
# deny = 3将注释去掉,将 3 改的足够大即可。
3.4. 统计某列中所有值出现的次数#
xxx | sort | uniq -c | sort -nrsort: 排序。这是为了让重复项排在一起。uniq -c: 连续的重复项只会显示一个。-c会在每个项目前添加重复次数。sort -nr: 排序。-n表示按数字排序。-r会按照从大到小排序。
3.5. 替换目录中某个字符串#
grep -rlZ OLD_STR | xargs -0 sed -i 's/OLD_STR/NEW_STR/g'