Shell基础与变量

Shell基础与变量

1. Shell脚本基础

  • 什么是Shell脚本?

    • 自动化运维工具
    • 批处理任务
    • 系统管理
  • 第一个Shell脚本

    #!/bin/bash
    echo "Hello, World!"
    • chmod +x script.sh 赋予执行权限
    • ./script.sh 运行脚本

2. 特殊变量

变量 含义 示例
$? 上一条命令的退出状态 echo $?
$$ 当前Shell的PID echo $$
$0 脚本名称 echo $0
$1, $2, ... 脚本参数 echo $1
${10} 第10个参数(避免$10解析错误) echo ${10}
$# 参数个数 echo $#
$@ 所有参数(每个参数独立) for arg in "$@"
$* 所有参数(合并成一个字符串) echo "$*"

示例:打印所有参数

#!/bin/bash
echo "脚本名: $0"
echo "参数个数: $#"
echo "所有参数: $@"
echo "第一个参数: $1"
echo "第二个参数: $2"

3. 变量定义与使用

  • 变量定义
    name="Alice"
    age=25
  • 变量引用
    echo $name
    echo ${name}  # 推荐使用${}避免歧义
  • 只读变量
    readonly PI=3.1415
  • 删除变量
    unset name

4. 字符串操作

str="Hello World"
echo ${#str}       # 字符串长度
echo ${str:0:5}    # 截取子串
echo ${str/World/Linux}  # 替换

5. 数组

arr=("apple" "banana" "cherry")
echo ${arr[1]}     # 访问元素
echo ${arr[@]}     # 所有元素
echo ${#arr[@]}    # 数组长度

下午:条件判断与循环

1. 条件判断(if)

基本语法

if [ condition ]; then
    commands
elif [ condition ]; then
    commands
else
    commands
fi

常用判断条件
| 条件 | 含义 |
|——|——|
| -f file | 文件是否存在 |
| -d dir | 目录是否存在 |
| -z str | 字符串是否为空 |
| -n str | 字符串是否非空 |
| a -eq b | 数值相等 |
| a -ne b | 数值不等 |
| a -gt b | a > b |
| a -lt b | a < b |

示例:检查文件是否存在

if [ -f "/etc/passwd" ]; then
    echo "文件存在"
else
    echo "文件不存在"
fi

2. 循环(for/while)

for循环

for i in {1..5}; do
    echo "Number: $i"
done

while循环

count=1
while [ $count -le 5 ]; do
    echo "Count: $count"
    ((count++))
done

示例:遍历目录下的文件

for file in /var/log/*; do
    echo "Found file: $file"
done

3. case语句

case $1 in
    "start")
        echo "Starting service..."
        ;;
    "stop")
        echo "Stopping service..."
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        ;;
esac

实战案例与运维脚本

实战案例

1. 求水仙花数

#!/bin/bash
for num in {100..999}; do
    a=$((num / 100))
    b=$((num % 100 / 10))
    c=$((num % 10))
    if [ $((a*a*a + b*b*b + c*c*c)) -eq $num ]; then
        echo "水仙花数: $num"
    fi
done

2. 查找包含特定文字的文件

#!/bin/bash
if [ $# -ne 2 ]; then
    echo "Usage: $0 <directory> <text>"
    exit 1
fi

dir=$1
text=$2

if [ ! -d "$dir" ]; then
    echo "目录不存在: $dir"
    exit 1
fi

grep -rl "$text" "$dir"

3. 批量重命名文件

#!/bin/bash
count=1
for file in *.txt; do
    mv "$file" "document_$count.txt"
    ((count++))
done

运维脚本实战

1. 监控CPU使用率

#!/bin/bash
threshold=80
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d. -f1)

if [ $cpu_usage -gt $threshold ]; then
    echo "CPU使用率过高: $cpu_usage%"
    # 发送警报邮件
    echo "CPU警报" | mail -s "CPU使用率 $cpu_usage%" admin@example.com
fi

2. 自动备份MySQL数据库

#!/bin/bash
DB_USER="root"
DB_PASS="password"
BACKUP_DIR="/backups"
DATE=$(date +%Y%m%d)

if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
fi

mysqldump -u$DB_USER -p$DB_PASS --all-databases > "$BACKUP_DIR/db_backup_$DATE.sql"
gzip "$BACKUP_DIR/db_backup_$DATE.sql"

3. 检查磁盘空间

#!/bin/bash
threshold=90
df -h | awk 'NR>1 {print $5, $6}' | while read usage mount; do
    usage=${usage%\%}
    if [ $usage -gt $threshold ]; then
        echo "磁盘空间不足: $mount ($usage%)"
    fi
done

4. 批量创建用户

#!/bin/bash
if [ $# -ne 1 ]; then
    echo "Usage: $0 <user_list_file>"
    exit 1
fi

while read username; do
    if id "$username" &>/dev/null; then
        echo "用户已存在: $username"
    else
        useradd "$username"
        echo "用户创建成功: $username"
    fi
done < "$1"

作业

  1. 写一个脚本,统计指定目录下每种文件扩展名的数量
  2. 写一个脚本,检查系统中所有运行中的服务并列出监听端口
  3. 写一个脚本,自动清理 /tmp 下超过7天的文件
作者:admin  创建时间:2025-05-29 09:34
最后编辑:admin  更新时间:2025-05-29 13:26