什么是 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 "没错"

下一篇:输入输出与重定向。