原标题:Bash Shell脚本

Bash Shell 基础概念

变量 含义 示例
$0 当前脚本名 test.sh
$1 第一个参数 Tom
$2 第二个参数 18
$# 参数数量 2
$@ 所有参数(逐个保留) Tom 18
$* 所有参数(整体) Tom 18
$$ 当前 Shell 的 PID 12345
$? 上一个命令退出码 0
$HOME 家目录 /home/tom
$PATH 命令搜索路径 /usr/bin:/bin
$USER 当前用户名 tom
$PWD 当前工作目录 /home/tom/project
$SHELL 当前 Shell 程序 /bin/bash

变量

Bash 变量不需要声明类型,直接赋值即可,注意等号两边不能有空格:

name="Tom"

echo $name
name="star"
age=25
echo $name        # 引用变量用 $
echo ${name}       # 更规范的写法,尤其是拼接字符串时
#Shell 变量没有类型
age=20

path="/home"

hello="world"

变量为什么不用 $

赋值:

name=Tom

取值:

echo$name

因为

name

表示变量名字。

而

$name

表示变量里面的内容。

if 条件判断

age=18

if [ $age -ge 18 ]; then
    echo "Adult"
fi
if [ "$age" -gt 18 ]; then
    echo "成年"
elif [ "$age" -eq 18 ]; then
    echo "刚好18"
else
    echo "未成年"
fi

常用比较符:

  • 数字:eq ne gt lt ge le
  • 字符串:= != z(空) n(非空)
  • 文件:f(存在且是文件) d(存在且是目录) e(存在)
运算符 英文 含义 示例
-eq equal 等于 5 -eq 5
-ne not equal 不等于 5 -ne 3
-gt greater than 大于 5 -gt 3
-lt less than 小于 3 -lt 5
-ge greater than or equal 大于等于 5 -ge 5
-le less than or equal 小于等于 3 -le 5

for 循环

# 遍历列表
for i in 1 2 3 4 5; do
    echo $i
done

# 遍历文件
for file in /var/log/*.log; do
    echo "处理: $file"
done

# C 风格
for ((i=0; i<10; i++)); do
    echo $i
done

while 循环

count=0
while [ $count -lt 5 ]; do
    echo $count
    count=$((count + 1))
done

# 常用于逐行读文件
while read -r line; do
    echo "$line"
done < file.txt

function(函数)

把一段命令封装起来复用:

function greet() {
    echo "Hello, $1"    # $1 是第一个参数
}
# 也可以省略 function 关键字:
greet() {
    echo "Hello, $1"
}

greet "star"    # 调用,输出 Hello, star

函数内部:$1 $2 ... 是传入的参数,$# 是参数个数,$@ 是所有参数。

$?

上一条命令的退出状态码。0 表示成功,非0表示失败(不同数字代表不同错误类型,由具体命令定义)。

ls /tmp
echo $?    # 通常输出 0

ls /不存在的目录
echo $?    # 输出非0,比如 2

这个在脚本里常用来判断上一步是否执行成功:

cp file.txt /backup/
if [ $? -eq 0 ]; then
    echo "复制成功"
else
    echo "复制失败"
fi

$PATH

系统查找可执行程序的目录列表,用冒号分隔。你敲一个命令(比如 ls),shell 会按 $PATH 里的顺序去这些目录找同名可执行文件。

echo $PATH
# 例如: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

如果你自己写了脚本想全局调用,得把脚本所在目录加进 $PATH,或者把脚本放进已有的 $PATH 目录里。

$HOME

当前用户的家目录路径,比如 /home/star 或 root 的 /root。很多程序的配置文件默认放在 $HOME 下(如 ~/.bashrc)。~ 其实就是 $HOME 的简写。

$USER

当前登录用户的用户名,比如 star。常用于脚本里做权限判断或个性化路径拼接。


这几个($? $PATH $HOME $USER)都属于环境变量/特殊变量,是 shell 启动时或命令执行后自动设置的,不需要你手动赋值。用 env 或 printenv 可以看到当前所有环境变量。