《Shell脚本速成手册:变量、数组、函数一网打尽,让你的运维效率翻倍!》

一、Shell的本质与价值

1.1 什么是Shell?

Shell是用户与操作系统内核之间的桥梁,具备双重角色:

  • 命令解释器:直接执行用户输入的命令(lsgrep等)

  • 脚本引擎:解释执行预编写的脚本文件

常见Shell类型:

Bash (Bourne Again Shell)  # Linux默认Shell
Zsh                        # 强大的交互式Shell
Ksh                        # 兼容性强的商业Shell

1.2 Shell的应用场景

  • 自动化运维(日志分析/备份)

  • 持续集成(CI/CD流水线)

  • 快速原型开发

  • 系统监控与告警

二、Shell的输入输出

2.1 echo 输出

echo "hello"            将字符直接输出到终端
echo "hello1" "hello2"  输出两个
echo -n "hello"         取消回车
echo $变量名             输出变量

2.2 read 输入

read 变量          从键盘中读取内容赋值给变量
read X1 X2 X3      读取多个值并用空格隔开
$ echo "hello"
$ read num
123
$ echo $num
123

三、变量操作精要

3.1 变量基础

name="Alice"       # 定义变量
echo $name         # 输出变量值
readonly PI=3.14   # 定义只读变量
unset name         # 删除变量

3.2 环境变量

echo $PATH            # 查看系统路径变量
export API_KEY="123"  # 设置环境变量

3.3 特殊变量

$0 脚本名称
$1 第一个参数
$# 参数个数
$* 所有参数
$? 上条命令返回值

四、数组操作大全

4.1 数组定义与访问

colors=("red" "green" "blue")  # 声明数组
echo ${colors[1]}              # 访问第二个元素 → green
colors[3]="yellow"             # 添加新元素

4.2 数组操作技巧

echo ${colors[@]}     # 所有元素
echo ${#colors[@]}    # 数组长度
echo ${!colors[@]}    # 获取所有索引

# 遍历数组
for color in "${colors[@]}"; do
    echo $color
done

五、功能性语句

5.1 测试性语句格式

格式1:test 测试条件
格式2:[测试条件]

举例:

if test "string1" = "string2" ; then
    echo "字符相等"
fi

str_1="张三"
str_2="张三"
if test $str_1 = $str_2; then
    echo "字符相等"
fi

if [ "string1" = "string2" ]; then
    echo "字符相等"
fi

5.2 测试条件

(1) 字符串对象(一定要注意在进行字符串的判断的时候都需要加上"", “$a" "hello"
    -z  判断字符串是否为空
    -n  判断字符串是否为非空
    =或--  都是用来判读字符串是否相等
    !=  不等于
    l>  大于(防止误认为重定向)
    l<  小于

(2) 数字对象
    -eq  等于
    -ne  不等于
    -gt  大于
    -lt  小于
    -ge  大于等于
    -le  小于等于

(3) 文件属性
    -b filename  检测文件是否为块设备,如果是则返回真
    -c filename  检测是否是字符设备文件,如果是则返回真
    -d filename  判断文件是否是目录,如果是则返回真
    -p filename  检测文件是否是管道文件,如果是则返回真
    -f filename  检测文件是否是普通文件,如果是则返回真
    -x filename  检测文件是否是可执行文件,如果是则返回真
    -L filename  判断文件是否存在,是否是链接文件(经测试链接文件也是-S filename判断文件是否存在,是否是套接字文件
    -s filename  判断文件是否存在,判断文件是否为空
    -e filename  判断文件是否存在

(4) 文件权限
    -r filename  判断文件是否存在,是否有可读权限
    -w filename  判断文件是否存在,是否有可写权限
    -x filename  判断文件是否存在,是否有可执行权限

(5) 文件比较
    -nt  文件是否更新
    -ot  文件是否更旧
    -ef  文件的inode是否一致

(6)逻辑运算
    -a 与 &&
    -o 或 || 
    !  非

六、流程控制语句

6.1 条件判断

if [ $num -gt 10 ]; then
    echo "大于10"
elif [ $num -eq 10 ]; then
    echo "等于10"
else
    echo "小于10"
fi

6.2 循环结构

# for循环
for i in {1..5}; do
    echo "Number $i"
done

# while循环
count=1
while [ $count -le 3 ]; do
    echo "Count: $count"
    ((count++))
done

6.3 Case语句

case $OS in
    "Linux")
        echo "使用apt/yum"
        ;;
    "MacOS")
        echo "使用brew"
        ;;
    *)
        echo "未知系统"
        ;;
esac

七、函数编程实践

7.1 函数基础

greet() {
    local name=$1   # 局部变量
    echo "Hello, $name"
}

greet "Alice"  # 调用函数

7.2 返回值处理

add() {
    return $(($1 + $2))
}
add 3 5
echo "结果: $?"  # 输出8

八、算术运算

8.1 整数运算

8.1.1 双括号法​(推荐)

a=10
b=3
echo "加法:$((a + b))"     # 13
echo "取余:$((a % b))"    # 1

8.1.2 let命令

let result=5+3
echo "5 + 3 = $result"

let result=10-4
echo "10 - 4 = $result"

let result=6*2
echo "6*2 = $result"

let result=20/4
echo "20 / 4 = $result"

let result=13%5
echo "13 % 5 = $result"

8.1.3 expr命令

num_1=$ (expr 5 +3)

8.2 浮点数运算(需借助bc

# 数值比较
if (( $num % 2 == 0 )); then
    echo "偶数"
fi

# 浮点运算
area=$(echo "scale=2; 3.14 * $r * $r" | bc)

Shell脚本通过简洁的语法实现了强大的系统管理能力。掌握变量、数组、流程控制和算术运算,可大幅提升自动化任务的效率。建议结合实战项目(如日志分析、定时任务)加深理解。掌握这些核心概念后,您已经可以编写高效的Shell脚本来自动化日常任务。记住:实践是最好的老师,多写多调试才能真正掌握Shell编程的精髓!