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 1line 2line 3
  • 如果添加 IFS=,获取到的字符串是 line 1line 2line 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 1

2.4.2. 找出并且打印文件大小#

find . -name '*.txt' -exec ls -lh {} +
find . -name '*.txt' -printf "%p %k KB\n"

3. 常用操作#

3.1. 比较两个目录#

diff --brief --recursive dir1 dir2

3.2. 输出格式化#

3.2.1. 改变输出的 tab 大小#

expand -t4 <FILE>

3.2.2. 将输出按表格输出#

echo STRING | column -t

3.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 -nr
  • sort: 排序。这是为了让重复项排在一起。
  • uniq -c: 连续的重复项只会显示一个。-c 会在每个项目前添加重复次数。
  • sort -nr: 排序。-n 表示按数字排序。-r 会按照从大到小排序。

3.5. 替换目录中某个字符串#

grep -rlZ OLD_STR | xargs -0 sed -i 's/OLD_STR/NEW_STR/g'