Linux系统的Shell常见指令和常见知识点小结(以bash为主)并不只看表面做法,关键还要理解相关条件、限制和后续影响。
echo $SHELL 或 echo $0#!/bin/bash (指定解释器)bash script.sh (新子进程)./script.sh (需 chmod +x)source script.sh / . script.sh (当前 Shell 执行,可修改环境变量)bash -n script.shbash -x script.shset -euo pipefail (遇错即停、未定义变量报错、管道命令失败也报错)| 命令 | 说明 |
|---|---|
ls -lh | 详细信息,人类可读的大小 |
cd - | 回到上一次目录 |
pwd | 打印当前完整路径 |
mkdir -p a/b/c | 递归创建目录 |
touch file | 新建空文件,或更新文件时间戳 |
cp -r src dst | 递归复制 |
mv old new | 移动/重命名 |
rm -rf dir | 危险 强制递归删除 |
find . -name "*.log" -mtime +7 -exec rm {} ; | 查找并删除7天前的日志 |
ln -s target linkname | 创建软链接 |
stat file | 查看文件详细属性 |
head -n 20 file # 前20行tail -n 20 file # 后20行tail -f /var/log/syslog # 实时跟踪less file # 分页浏览,/搜索,q退出wc -l file # 统计行数
chmod 755 file # rwxr-xr-xchmod u+x script.sh # 属主增加执行权限chown user:group filechgrp group file
数字计算:r=4, w=2, x=1
例:rwxr-x--- = 750
tar -czvf archive.tar.gz dir/ # 打包为 tar.gztar -xzvf archive.tar.gz # 解压 tar.gztar -cjvf archive.tar.bz2 dir/ # 打包为 tar.bz2tar -xjvf archive.tar.bz2zip -r file.zip dir/ # 压缩为 zipunzip file.zipgzip file # 生成 file.gzgunzip file.gz
curl -O http://example.com/file # 下载并保存curl -I http://example.com # 显示响应头wget http://example.com/fileping -c 4 google.comnetstat -tulnp | grep :80 # 查看端口占用ss -tulnp # 更现代的 netstat
ps aux | grep nginxtop # 实时监控,按 q 退出htop # 需安装,更好看kill -9 PID # 强制终止pkill -f pattern # 按名称模式终止& # 命令后加 & 后台运行jobs # 列出当前 Shell 后台任务fg %1 # 将后台任务 1 拉到前台bg %1 # 让暂停的任务在后台继续nohup long_cmd & # 关闭终端后仍运行,输出默认到 nohup.out
name="Linux" # 赋值等号两边不加空格echo "Hello, $name" # 双引号解析变量echo 'Hello, $name' # 单引号原样输出echo "PATH is ${PATH}" # 用大括号界定变量边界# 环境变量export MY_VAR="value" # 使子进程可见echo $HOME $USER $PWD $? # $? 上条命令退出码(0 成功)# 只读变量readonly PI=3.14# 命令结果赋值now=$(date) # 推荐使用 $()files_count=$(ls | wc -l)
| 变量 | 含义 |
|---|---|
$0 | 脚本名 |
$1, $2... | 第1、第2…个参数 |
$# | 参数个数 |
$@ | 所有参数(每个为独立字符串) |
$* | 所有参数(合并成一个字符串) |
$? | 上一条命令的退出码 |
$$ | 当前 Shell 的 PID |
$! | 最后一个后台命令的 PID |
str="Hello World"echo ${#str} # 长度:11echo ${str:0:5} # 截取:Helloecho ${str/World/Buddy} # 替换第一个匹配:Hello Buddyecho ${str//o/O} # 全局替换:HellO WOrld# 默认值处理(变量不存在或为空时使用默认值)echo ${UNSET_VAR:-"default"} -f 存在且为普通文件,-d 目录,-e 存在,-x 可执行,-s 非空= 相等,!= 不等,-z 空为真,-n 非空为真-eq(等于),-ne,-gt,-lt,-ge,-le推荐使用 [[ ]] (Bash 扩展),支持 &&、|| 和正则匹配,且变量无需加引号防空格拆分。

if [[ $name == "Alice" ]]; then echo "Welcome, Alice"elif [[ -f /etc/config ]]; then echo "Config found"else echo "Nothing matched"fi# 一行写法[[ -d /tmp ]] && echo "tmp exists"

case "$1" in start) echo "Starting...";; stop) echo "Stopping...";; restart|reload) echo "Restarting...";; *) echo "Usage: $0 {start|stop|restart}";;esac# for 循环for fruit in apple banana cherry; do echo "I like $fruit"done# C 风格 forfor (( i=0; i<5; i++ )); do echo "Number: $i"done# 遍历文件for logfile in /var/log/*.log; do gzip "$logfile"done# while 循环count=1while [[ $count -le 5 ]]; do echo "Count: $count" ((count++)) # 自增done# 按行读取文件while IFS= read -r line; do echo "$line"done < "file.txt"
循环控制:break 跳出整个循环,continue 跳过本次循环余下部分。
# 定义say_hello() { local name=$1 # 局部变量 echo "Hello, $name" return 0 # 返回值 0-255,仅表示状态}# 调用say_hello "Linux"# 获取函数输出msg=$(say_hello "World")echo "$msg"# 函数内可使用 $1..$n 获取参数| 操作 | 说明 |
|---|---|
cmd > file | 标准输出覆盖写入 |
cmd >> file | 标准输出追加写入 |
cmd < file | 从文件读取输入 |
cmd 2> err.log | 标准错误覆盖写入 |
cmd &> all.log | 标准输出和错误都写入同一文件 |
cmd > /dev/null 2>&1 | 丢弃所有输出 |
| `cmd1 | cmd2` |
| `cmd | tee file` |
Here Document(多行文本输入):
cat <<EOF > output.txtLine 1Line 2EOF
grep:搜索文本
grep "pattern" filegrep -i "pattern" file # 忽略大小写grep -r "pattern" /dir/ # 递归搜索grep -v "pattern" file # 反向匹配grep -c "pattern" file # 计数grep -E "regex" file # 扩展正则
sed:流编辑器,常用于替换
sed 's/old/new/g' file # 全局替换(仅输出,不改文件)sed -i 's/old/new/g' file # 直接修改文件sed '/pattern/d' file # 删除匹配行sed -n '5,10p' file # 打印第5到10行
awk:强大的文本分析工具
awk '{print $1, $3}' file # 打印第1和第3列(默认空格分隔)awk -F: '{print $1}' /etc/passwd # 指定分隔符为冒号awk '$3 > 1000' /etc/passwd # 按条件过滤history,!! 执行上一条,!$ 上条最后一个参数,!n 执行第 n 条。echo file{1,2,3}.txt 展开为 file1.txt file2.txt file3.txtcp file.txt{,.bak} 变成 cp file.txt file.txt.bak(cd /tmp && ls) 目录切换不影响当前 Shellecho $((5 + 3 * 2)),或 let a=5+3read -p "Your name: " usernamealias ll='ls -lh',永久写入 ~/.bashrc 或 ~/.bash_aliases"$v快速掌握Linux Shell核心指令,从基础命令到脚本调试全覆盖,包含文件操作、权限管理、文本处理三剑客与实用技巧,让你轻松提升命令行效率,即刻应对日常运维与开发任务ar",防止包含空格时出现意外。set -euo pipefail 或 set -eu。[[ ]] 而非 **[ ] 进行测试(写 Bash 脚本时)。$() 而非反引号,嵌套更清晰。local 声明,避免污染全局变量。echo 测试命令,或 rm 前加 -i。if command; then echo ok; fi。cd 等命令前不加引号,防止路径包含空格出错。