什么是 Shell
Shell 是命令行解释器——你敲的命令它来解析并交给内核。
主流:
| Shell | 备注 |
|---|---|
| bash | 几乎所有 Linux 默认 |
| zsh | 现代功能多(自动补全 / 主题),macOS 默认 |
| fish | 用户友好但语法不兼容 POSIX |
| dash | Ubuntu 的 /bin/sh,极简 |
写脚本默认指 bash(兼容性最好)。
看自己用啥
echo $SHELL # 当前登录 shell
echo $0 # 当前进程
which bash
写脚本:第一行 shebang
#!/bin/bash
echo "Hello, $USER"
#!/bin/bash告诉系统用 bash 跑- 加可执行权限:
chmod +x script.sh - 跑:
./script.sh
变量
# 赋值(=两边不能有空格!)
name="WadeLy"
age=30
# 用变量(前缀 $)
echo "Hello, $name"
echo "Hello, ${name}" # 推荐用 {} 明确边界
# 命令替换
now=$(date +%F) # 推荐
now=`date +%F` # 老式写法,不推荐
name = "WadeLy"(带空格)会报错——bash 把它当成命令 + 参数了。
单引号 vs 双引号
name="WadeLy"
echo 'Hello $name' # → Hello $name (字面)
echo "Hello $name" # → Hello WadeLy (展开)
echo "now: $(date)" # 双引号里命令替换有效
环境变量
进程之间传递的全局变量。
# 看所有环境变量
env
printenv
# 设环境变量(导出给子进程)
export MY_VAR="hello"
# 临时(仅当前命令)
MY_VAR="hello" myscript
# 永久(写进 ~/.bashrc 或 /etc/environment)
echo 'export PATH=$PATH:/opt/custom/bin' >> ~/.bashrc
source ~/.bashrc # 让当前 shell 立即生效
常用环境变量:
| 变量 | 含义 |
|---|---|
$PATH |
命令搜索路径 |
$HOME |
家目录(同 ~) |
$USER |
当前用户名 |
$SHELL |
默认 shell |
$PWD |
当前目录 |
$OLDPWD |
上次目录 |
$LANG |
语言(如 zh_CN.UTF-8) |
$EDITOR |
默认编辑器(cron / git 等用到) |
特殊变量(脚本里很有用)
$0 脚本名
$1 $2 位置参数(第 1、第 2 个参数)
$# 参数个数
$@ 所有参数(独立)
$* 所有参数(一个字符串)
$? 上一条命令的退出码(0 = 成功)
$$ 当前进程 PID
$! 最后一个后台进程 PID
例:
#!/bin/bash
# script.sh
echo "脚本名: $0"
echo "第 1 个参数: $1"
echo "参数总数: $#"
echo "所有参数: $@"
cp /no/such/file /tmp/ # 失败
echo "上条命令退出码: $?" # → 1
./script.sh a b c
# 脚本名: ./script.sh
# 第 1 个参数: a
# 参数总数: 3
# 所有参数: a b c
# 上条命令退出码: 1
$? 退出码
0 成功
1-255 失败(不同数字含义不同)
判断成功失败的基础:
if grep -q "ERROR" log.txt; then
echo "有错误"
fi
# 简写
grep -q "ERROR" log.txt && echo "有错"
grep -q "ERROR" log.txt || echo "没错"
下一篇:输入输出与重定向。