美文网首页Linux/Apache/Nignx
Shell 脚本编程15分钟入门

Shell 脚本编程15分钟入门

作者: 吴佳浩 | 来源:发表于2023-07-17 11:25 被阅读0次

    Shell 脚本编程教程

    1. Shell简介

    Shell是一种脚本语言,可以使用脚本来控制系统的各种操作和任务。Shell 脚本包含一系列命令,这些命令组合在一起实现自动化的任务。Shell非常强大和灵活,包含许多操作系统命令和工具。

    常见的Shell包括:

    • Bourne Shell(/usr/bin/sh或/bin/sh)
    • Bourne Again Shell(bash)(/bin/bash)
    • C Shell(csh)(/usr/bin/csh)
    • K Shell(ksh)(/usr/bin/ksh)
    • Shell for Root(sh)(/sbin/sh)

    Linux系统默认使用bash shell。本文将主要讲解bash shell的脚本编程。

    2. 第一个Shell脚本

    编写一个简单的Shell脚本来输出"Hello World"。

    (1) 新建HelloWorld.sh脚本

    #!/bin/bash
      
    echo "Hello World!"
    
    • 第一行 #!/bin/bash 指定该脚本使用bash解释器
    • 第二行编写命令

    (2) 运行脚本

    $ chmod +x HelloWorld.sh # 添加可执行权限
    $ ./HelloWorld.sh 
    Hello World!
    

    3. 变量

    变量用于存储值,方便重复使用。

    (1) 定义变量

    name="John"
    

    变量名和等号之间不能有空格。

    (2) 使用变量

    使用$来获取变量的值:

    echo $name
    

    输出:

    John
    

    也可以用{}包裹变量名:

    echo ${name}
    

    (3) 只读变量

    使用readonly命令可以将变量定义为只读:

    readonly name
    

    只读变量无法修改。

    (4) 删除变量

    使用unset命令可以删除变量:

    unset name
    

    4. 字符串

    字符串可以用单引号或者双引号表示。

    (1) 单引号字符串

    name='John'
    

    单引号内的任何字符都会原样输出。

    (2) 双引号字符串

    name="John"
    

    双引号里可以有变量。

    echo "Hello $name" # Hello John
    

    (3) 字符串操作

    • $name:获取字符串长度
    • ${name:0:4}:提取子字符串
    • ${name#word}:删除开头匹配的word
    • ${name%word}:删除结尾匹配的word
    • ${name/old/new}:替换第一个old为new

    5. 数组

    数组可以存储多个值。

    (1) 定义数组

    names=(John Bob Lucy Tom) 
    

    数组元素之间用空格分隔。

    也可以单独定义每个元素:

    names[0]=John
    names[1]=Bob
    

    (2) 读取数组

    使用${数组名[索引]}读取元素:

    echo ${names[0]} # John
    echo ${names[1]} # Bob
    

    使用@可以获取整个数组:

    echo ${names[@]} # John Bob Lucy Tom
    

    (3) 获取数组长度

    使用#获取数组元素个数:

    echo ${#names[@]} # 4
    

    6. 参数

    我们可以向脚本传入参数,在脚本中访问参数。

    (1) 向脚本传参数

    例如有个test.sh脚本:

    echo $0    # 打印脚本名
    echo $1    # 打印第1个参数
    echo $2    # 打印第2个参数
    

    运行时传入参数:

    ./test.sh hello world
    

    输出:

    ./test.sh
    hello
    world
    

    0获得脚本名,1-9分别得到1-9个参数。10以上的参数需要用{10}表示。

    (2) 特殊参数

    • $#:获取参数总数
    • $@:代表所有参数,以数组形式存储
    • $*:代表所有参数,作为一个整体字符串

    例如:

    #!/bin/bash
    echo $# # 2
    echo $@ # hello world
    echo $* # hello world
    

    7. 运算符

    Shell支持多种算术和逻辑运算符。

    (1) 算术运算符

    a=10
    b=20
    
    echo $((a + b)) # 30 
    echo $((a - b)) # -10
    echo $((a * b)) # 200
    

    支持 + - * / % 等算术运算。

    注意expr命令的限制:

    • 运算符之间要有空格
    • 整个表达式要被``包裹
    • *要转义为*,/同理
    expr 10 + 20 # 30
    expr 10 \* 20 # 200
    

    expr做字符串连接使用|:

    a=hello
    b=world
    expr $a \| $b # helloworld
    

    (2) 关系运算符

    • -eq检查是否相等
    • -ne检查是否不等
    • -gt/-lt检查大于/小于
    • -ge/-le检查大于等于/小于等于

    例如:

    [ 10 -eq 20 ] # False
    [ 10 -gt 5 ] # True
    

    需要注意[ ]表达式和空格。

    (3) 逻辑运算符

    • !非
    • -o或
    • -a和

    例如:

    [ ! 10 -eq 20 ] # True 
    [ 10 -lt 20 -a 10 -gt 5 ] # True
    

    8. 条件判断

    条件判断可以决定运行哪些命令。

    (1) if语句

    if语句最基本的语法:

    if [ 条件判断 ]; then
      程序
    fi
    

    示例:

    count=100
    if [ $count -eq 100 ]; then
       echo "Count is 100"
    fi
    

    if else语句:

    if [条件]; then
      程序1
    else
      程序2  
    fi
    

    if elif else语句:

    if [条件1]; then
       程序1
    elif [条件2]; then
       程序2
    else
       程序3
    fi
    

    (2) case语句

    case语句可以匹配多个值:

    case $变量名 in
      "值1")
        程序1
        ;;
      "值2")
        程序2  
        ;;
      *)
        默认程序
    esac
    

    示例:

    read -p "输入1-3:" num
    case $num in
      "1")
        echo "你选择了1"
        ;;
      "2")
        echo "你选择了2"
        ;;
      "3")
        echo "你选择了3"
        ;;
      *)  
        echo "你没有输入1-3"
    esac
    

    9. 循环语句

    循环可以多次执行代码块。

    (1) for循环

    for循环一般用于遍历数组和字符串。

    for 变量 in 值1 值2 ...
    do
      程序
    done
    

    示例:

    for name in Tom John Bill
    do
      echo "Hello $name"
    done
    

    也可以用{1..10}表示1-10的整数序列。

    (2) while循环

    while循环通过判断条件来执行循环。

    while [ 条件判断 ]
    do
       程序
    done
    

    示例:

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

    (3) until循环

    until循环与while相反,条件为false时执行循环。

    until [ 条件判断 ]
    do
       程序  
    done
    

    10. 函数

    函数可以封装代码片段实现代码重用。

    (1) 定义函数

    function fun_name() {
      #代码
    }
    

    也可以:

    fun_name() {
      #代码 
    }
    

    示例:

    function sayHello() {
       echo "Hello $1"
    }
    

    (2) 调用函数

    直接使用函数名调用:

    sayHello "John" # Hello John
    

    函数可以接收参数,在函数内部通过1,2等来引用参数。

    函数也可以返回值通过$?。

    11. 输入/输出

    Shell提供了输入和输出的命令。

    (1) 输出

    • echo:打印输出
    • printf:格式化输出
    • read:从输入读取值

    例如:

    echo "Hello"
    read name
    echo "Hello $name"
    

    运行结果:

    Hello
    John # 用户输入
    Hello John
    

    (2) 文件输入输出

    • cat:打印文件内容
    • wc:统计字数
    • grep:匹配查找
    • sort:排序
    • uniq:去重
    • >:重定向输出
    • >>:追加
    • <:输入重定向
    • |:管道,连接命令

    例如:

    cat file.txt | grep 'hello' >> result.txt
    

    12. 实战范例

    下面通过一些实例,来实战运用Shell脚本:

    (1) 备份脚本

    编写一个脚本,完成文件夹的压缩打包备份:

    #!/bin/bash
    
    # 获取当前日期
    date=$(date +%Y%m%d) 
    
    # 文件备份路径
    archive_dir="/data/backup/$date"
    
    # 如果备份目录不存在,创建目录
    if [ ! -d "$archive_dir" ]; then
      mkdir -p $archive_dir
    fi
    
    # 压缩打包文件
    tar -czf "$archive_dir/archive.tar.gz" /data/
    
    echo "Done"
    

    (2) 监控脚本

    编写一个简单的监控脚本,每隔1秒查询一次系统负载:

    #!/bin/bash
    
    while true
    do
      load=$(uptime | awk '{print $8,$9,$10}')
      echo "$(date) Load: $load"
      sleep 1
    done  
    

    可以看到实时输出系统负载信息。

    (3) 下载脚本

    使用wget命令编写一个批量下载文件的脚本:

    #!/bin/bash
    
    URL_LIST=url_list.txt
    
    while read line; do
      wget $line
    done < $URL_LIST
    

    url_list.txt内每行包含一个下载链接。

    总结

    以上内容总结了Shell脚本的基本语法和功能,可以通过实际的例子熟练掌握Shell编程
    在本文的Shell脚本编程教程中,我们学习了以下主要内容:

    1. Shell简介:介绍了Shell是一种脚本语言,以及常见的Shell类型。

    2. 第一个Shell脚本:编写了一个简单的Shell脚本输出"Hello World"。

    3. 变量:学习了如何定义、使用和删除变量,并了解了只读变量的概念。

    4. 字符串:探讨了单引号和双引号字符串的使用,并介绍了字符串操作的一些技巧。

    5. 数组:了解了如何定义、访问和获取数组的长度。

    6. 参数:学习了如何向脚本传递参数,并了解了特殊参数的用法。

    7. 运算符:探讨了算术、关系和逻辑运算符的使用。

    8. 条件判断:学习了if、if else和case语句的使用,以及如何在Shell中进行条件判断。

    9. 循环语句:介绍了for、while和until循环的使用。

    10. 函数:学习了如何定义和调用函数,并了解了函数的参数和返回值。

    11. 输入/输出:了解了如何进行输出和输入操作,以及文件输入输出的基本命令。

    12. 实战范例:通过备份脚本、监控脚本和下载脚本的实例,展示了Shell脚本在实际应用中的用途。

    总的来说,本程教程包含了基本的语法和实战示例,适合初学者入门,同时也可供有经验的开发者回顾和复习Shell脚本编程的知识。通过学习这些内容,读者可以掌握Shell脚本的基本用法,并在实际项目中运用这些知识来完成自动化任务和系统管理工作。

    相关文章

      网友评论

        本文标题:Shell 脚本编程15分钟入门

        本文链接:https://www.haomeiwen.com/subject/pnkgudtx.html