• Shell脚本语言用法详解(超详细~)


    Shell

    在这里插入图片描述

    一、Shell是什么?

    Shell 是一种用于与操作系统交互的命令行解释器和脚本语言

    它是用户和操作系统内核之间的接口,允许用户输入命令并将其发送到操作系统以执行

    在这里插入图片描述
    Linux系统提供了多种Shell解析器,其中一些最常见的包括:

    1.Bash(Bourne Again Shell):

    • Bash是Linux系统中最常用的Shell解析器之一,也是默认的Shell。
    • 它是Bourne Shell(sh)的增强版本,具有更多功能和扩展,支持命令自动补全、历史命令记录、作业控制等特性。

    2.Zsh(Z Shell):

    • Zsh是一个功能丰富的Shell解析器,提供了许多高级功能,如强大的自动补全、主题和插件系统、高级别的配置选项等。
    • 它在用户友好性和定制性方面比Bash更加强大。

    3.Fish(Friendly Interactive Shell):

    • Fish是一个用户友好的交互式Shell,具有语法高亮、智能命令补全、简洁的语法等特性。
    • Fish的设计旨在提供更直观和易用的命令行体验。

    4.Ksh(Korn Shell):

    • Ksh是由David Korn开发的Shell解析器,具有与Bash类似的语法和功能。
    • 它是商业Unix系统中常见的Shell之一,但在Linux中也可用。

    5.Dash:

    • Dash是一个轻量级的Shell解析器,专注于执行脚本时的快速启动和执行。
    • 在一些Linux发行版中,Dash被用作/bin/sh的符号链接,用于提高系统启动和脚本执行的性能。

    二、Shell怎么使用?

    1.变量

    变量的命名和赋值

    在 Shell 中,变量的命名遵循以下规则:

    • 变量名由字母、数字和下划线组成,但不能以数字开头。
    • 变量名区分大小写。
    • 通常使用大写字母命名环境变量,使用小写字母命名用户自定义变量。
    • 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

    变量的赋值使用等号 =,如下所示:

    variable_name=value
    

    在赋值时,等号两侧不需要空格。

    例如:

    name="yushifu"
    age=23
    

    变量类型

    字符串变量:存储文本数据。
    数字变量:存储数值数据,可以进行算术运算。
    数组变量:存储多个值的有序集合,可以通过索引来访问。

    #定义字符串变量
    my_string="Hello, World!"
    
     定义数字变量
    my_number=42
    
     定义数组变量
    my_array=("apple" "banana" "orange")
    

    变量的作用域

    在Shell脚本中,变量的作用域分为全局变量和局部变量。

    默认情况下,变量都是全局的,可以在脚本的任何位置访问。

    但是在函数内部定义的变量通常是局部的,只在函数内部有效。


    只读变量

    可以使用 readonly 命令将变量设置为只读,之后无法修改变量的值:

    readonly name="yushifu"
    

    readonly变量,注意:不能unset。


    删除变量

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

    unset name
    

    环境变量

    Shell 还支持环境变量,它们对整个系统或用户会话可见。可以使用 export 命令将变量导出为环境变量:

    export PATH="/usr/local/bin:$PATH"
    

    系统预定义变量

    常用系统变量

    $HOME$PWD$SHELL$USER

    (1)查看系统变量的值。

    [shells]$ echo $HOME
    /home/yushifu
    

    在这里插入图片描述

    (2)显示当前Shell中所有变量:set。

    [shells]$ set
    BASH=/bin/bash
    BASH_ALIASES=()
    BASH_ARGC=()
    BASH_ARGV=()
    


    变量的使用

    要在 Shell 脚本中引用变量的值,可以使用 $ 符号,或者使用 ${} 进行包裹,如下所示:

    echo "Hello, $name"  # 输出 Hello,yushifu
    echo "he is ${age} years old"  # 输出 he is 23 years old
    
    • 定义变量A。
    [shells]$ A=5
    [shells]$ echo $A
    5
    

    在这里插入图片描述

    • 给变量A重新赋值。
    [shells]$ A=8
    [shells]$ echo $A
    8
    

    在这里插入图片描述

    • 撤销变量A。
    [shells]$ unset A
    [shells]$ echo $A
    

    在这里插入图片描述

    • 声明静态的变量B=2,不能unset。
    [shells]$ readonly B=2
    [shells]$ echo $B
    2
    [shells]$ B=9
    -bash: B: readonly variable
    

    在这里插入图片描述

    • 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
    [shells]$ C=1+2
    [shells]$ echo $C
    1+2
    

    在这里插入图片描述

    • 变量的值如果有空格,需要使用双引号或单引号括起来。
    [shells]$ D=I love banzhang
    -bash: world: command not found
    [shells]$ D="I love banzhang"
    [shells]$ echo $D
    I love banzhang
    

    在这里插入图片描述

    • 可把变量提升为全局环境变量,可供其他Shell程序使用。

    export 变量名

    [shells]$ vim helloworld.sh 
    

    在helloworld.sh文件中增加echo $B。

    #!/bin/bash
    
    echo "helloworld"
    echo $B
    
    [shells]$ ./helloworld.sh 
    Helloworld
    

    发现并没有打印输出变量B的值。

    [shells]$ export B
    [shells]$ ./helloworld.sh 
    helloworld
    2
    
    • 使用字符串拼接操作符 += 或者直接将变量连接在一起。
    定义两个字符串变量
    first_name="John"
    last_name="Doe"
    
    使用字符串拼接操作符 +=
    full_name="$first_name"
    full_name+=" $last_name"
    
     输出拼接后的字符串
    echo "Full name: $full_name"
    

    在这里插入图片描述

    直接将变量连接在一起:
    
    定义两个字符串变量
    first_name="John"
    last_name="Doe"
    
     将两个变量连接在一起
    full_name="$first_name $last_name"
    
     输出拼接后的字符串
    echo "Full name: $full_name"
    

    在这里插入图片描述


    • 使用 ${} 来进行字符串的替换或者使用命令替换。
    单次替换:
    
     定义一个字符串变量
    my_string="Hello, World!""Hello" 替换为 "Hi"
    new_string="${my_string/Hello/Hi}"
    
     输出替换后的字符串
    echo "$new_string"
    
    全局替换:
    
     定义一个字符串变量
    my_string="Hello, World! Hello, Universe!"
    
    将所有的 "Hello" 替换为 "Hi"
    new_string="${my_string//Hello/Hi}"
    
     输出替换后的字符串
    echo "$new_string"
    
    删除匹配的字符串:
    
    定义一个字符串变量
    my_string="Hello, World!"
    
    删除所有的 "l" 字符
    new_string="${my_string//l/}"
    
    输出删除后的字符串
    echo "$new_string"
    
    在匹配的字符串前缀进行替换:
    
    定义一个字符串变量
    my_string="Hello, World!"
    
    将以 "Hello" 开头的部分替换为 "Hi"
    new_string="${my_string/#Hello/Hi}"
    
    输出替换后的字符串
    echo "$new_string"
    
    在匹配的字符串后缀进行替换:
    
    定义一个字符串变量
    my_string="Hello, World!"
    
    将以 "World!" 结尾的部分替换为 "Universe!"
    new_string="${my_string/%World!/Universe!}"
    
    输出替换后的字符串
    echo "$new_string"
    
    • 使用 ${array[@]} 和 ${#array[@]} 等操作数组。

    在Shell中,可以使用 ${array[@]} 来引用数组的所有元素,并使用 ${#array[@]} 来获取数组的长度。

    引用数组的所有元素:

    # 定义一个数组
    my_array=("apple" "banana" "orange")
    
    # 使用 ${array[@]} 引用数组的所有元素
    echo "Fruits: ${my_array[@]}"
    


    ${my_array[@]} 会将数组 my_array 中的所有元素作为一个整体引用,以空格分隔。

    获取数组的长度:

    # 定义一个数组
    my_array=("apple" "banana" "orange")
    
    # 使用 ${#array[@]} 获取数组的长度
    array_length="${#my_array[@]}"
    
    # 输出数组的长度
    echo "Length of array: $array_length"
    

    在这里插入图片描述

    遍历数组元素:

    # 定义一个数组
    my_array=("apple" "banana" "orange")
    
    # 使用 for 循环遍历数组
    echo "Fruits:"
    for fruit in "${my_array[@]}"; do
        echo "- $fruit"
    done
    

    特殊变量和位置参数

    • $n

    1)基本语法
    $n
    (功能描述:n为数字,$0代表该脚本名称,$1- $9 代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}。)

    [shells]$ touch parameter.sh 
    [shells]$ vim parameter.sh
    #!/bin/bash
    echo '==========$n=========='
    echo $0 
    echo $1 
    echo $2
    
    [atguigu@hadoop101 shells]$ chmod 777 parameter.sh
    [atguigu@hadoop101 shells]$ ./parameter.sh yu shifu
    ==========$n==========
    ./parameter.sh
    yu
    shifu
    

    在这里插入图片描述
    在这里插入图片描述


    $#
    1)基本语法
    $#功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)。

    [shells]$ vim parameter.sh
    #!/bin/bash
    echo '==========$n=========='
    echo $0 
    echo $1 
    echo $2
    echo '==========$#=========='
    echo $#
    
    [shells]$ chmod 777 parameter.sh
    [shells]$ ./parameter.sh yu shifu
    ==========$n==========
    ./parameter.sh
    yu
    shifu
    ==========$#==========
    2
    

    在这里插入图片描述
    在这里插入图片描述


    $*、$@
    1)基本语法
    $*功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
    $@功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待

    [shells]$ vim parameter.sh
    #!/bin/bash
    echo '==========$n=========='
    echo $0 
    echo $1 
    echo $2
    echo '==========$#=========='
    echo $#
    echo '==========$*=========='
    echo $*
    echo '==========$@=========='
    echo $@
    [shells]$ ./parameter.sh a b c d e f g
    ==========$n==========
    ./parameter.sh
    a
    b
    ==========$#==========
    7
    ==========$*==========
    a b c d e f g
    ==========$@==========
    a b c d e f g
    

    $?
    1)基本语法
    $? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了)

    判断helloworld.sh脚本是否正确执行。

    [shells]$ ./helloworld.sh 
    hello world
    [shells]$ echo $?
    0
    

    2.运算符

    1)基本语法

    $((运算式))” 或 “$[运算式]
    # 定义两个数
    num1=10
    num2=5
    
    # 加法
    result=$((num1 + num2))
    echo "Addition: $result"
    
    # 减法
    result=$((num1 - num2))
    echo "Subtraction: $result"
    
    # 乘法
    result=$((num1 * num2))
    echo "Multiplication: $result"
    
    # 除法
    result=$((num1 / num2))
    echo "Division: $result"
    
    # 取模
    result=$((num1 % num2))
    echo "Modulus: $result"
    

    3.条件判断

    1)基本语法

    (1)test condition
    (2)[ condition ](注意condition前后要有空格)
    注意:条件非空即为true,[ yushifu ] 返回true,[  ] 返回false。
    

    2)常用判断条件

    (1)两个整数之间比较

     	-eq 等于(equal)
     	-ne 不等于(not equal)
     	-lt 小于(less than)
     	-le 小于等于(less equal)
     	-gt 大于(greater than)
     	-ge 大于等于(greater equal)	
    
    1. 两个整数之间比较
    # 比较两个整数
    num1=10
    num2=20
    
    if [ $num1 -eq $num2 ]; then
        echo "num1 is equal to num2"
    fi
    
    if [ $num1 -ne $num2 ]; then
        echo "num1 is not equal to num2"
    fi
    
    if [ $num1 -lt $num2 ]; then
        echo "num1 is less than num2"
    fi
    
    if [ $num1 -le $num2 ]; then
        echo "num1 is less than or equal to num2"
    fi
    
    if [ $num1 -gt $num2 ]; then
        echo "num1 is greater than num2"
    fi
    
    if [ $num1 -ge $num2 ]; then
        echo "num1 is greater than or equal to num2"
    fi
    

    (2)按照文件权限进行判断

    	-r 有读的权限(read)	
    	-w 有写的权限(write)
    	-x 有执行的权限(execute)
    

    实例

    # 检查文件权限
    file="/path/to/file"
    
    if [ -r $file ]; then
        echo "File is readable"
    fi
    
    if [ -w $file ]; then
        echo "File is writable"
    fi
    
    if [ -x $file ]; then
        echo "File is executable"
    fi
    

    (3)按照文件类型进行判断

    -e 文件存在(existence)
    -f 文件存在并且是一个常规的文件(file)
    -d 文件存在并且是一个目录(directory)
    

    实例

    # 检查文件类型
    file="/path/to/file"
    
    if [ -e $file ]; then
        echo "File exists"
    fi
    
    if [ -f $file ]; then
        echo "File is a regular file"
    fi
    
    if [ -d $file ]; then
        echo "File is a directory"
    fi
    

    4.流程控制

    if判断

    1)基本语法

    (1)单分支
    if [ 条件判断式 ];then 
        程序 
    fi 
    
    或者 
    
    if  [ 条件判断式 ] 
    then 
        程序 
    fi
    
    -----------------------------------------------------------
    (2)多分支
    if [ 条件判断式 ] 
    then 
        程序 
    elif [ 条件判断式 ]
    then
    	程序
    else
    	程序
    fi
    注意事项:
    ① [ 条件判断式 ],中括号和条件判断式之间必须有空格
    ② if后要有空格
    

    实例

    单分支
    # 示例1: 单分支,使用then on the same line
    if [ $age -ge 18 ]; then 
        echo "You are an adult."
    fi
    
    # 示例2: 单分支,使用then on a new line
    if [ $temperature -gt 20 ] 
    then
        echo "It's a nice day!"
    fi
    
    多分支
    # 示例3: 多分支
    if [ $grade == "A" ]
    then
        echo "Excellent!"
    elif [ $grade == "B" ]
    then
        echo "Good!"
    else
        echo "Work harder!"
    fi
    
    
    1.在条件判断式的方括号 [ ] 与具体的条件之间需要有空格。
    2.if 后面有一个空格。
    3.在单分支和多分支结构中,then 可以与 if 写在同一行,也可以另起一行,取决于编码风格和个人偏好。
    

    case语句

    case 语句在 Shell 脚本中用于根据不同的情况执行不同的代码块。它的语法结构如下:
    case expression in
        pattern1)
            # 在满足 pattern1 时执行的代码
            ;;
        pattern2)
            # 在满足 pattern2 时执行的代码
            ;;
        patternN)
            # 在满足 patternN 时执行的代码
            ;;
        *)
            # 默认情况下执行的代码,类似于 switch 语句中的 default 分支
            ;;
    esac
    

    1.expression 是要被匹配的值或变量。
    2.pattern1、pattern2、patternN 是用于匹配 expression 的模式。每个模式后面跟着一个圆括号 ( )。
    3.;; 是每个模式执行完毕时的标志,类似于 case 语句中的 break。
    4.*) 是一个通配符,表示如果没有任何模式匹配,则执行 *) 后面的代码块。

    示例
    #!/bin/bash
    
    # 定义一个变量
    fruit="apple"
    
    # 使用 case 语句判断水果类型
    case $fruit in
        apple)
            echo "It's an apple."
            ;;
        banana)
            echo "It's a banana."
            ;;
        orange)
            echo "It's an orange."
            ;;
        *)
            echo "It's something else."
            ;;
    esac
    
    在这个例子中,根据变量 fruit 的值,case 语句匹配相应的模式,并执行相应的代码块。如果 fruit 的值不匹配任何模式,那么就执行 *) 后面的代码块。
    

    case 语句在需要根据多种情况进行不同处理时非常有用,它比多个 if-elif-else 结构更加简洁。


    for循环

    for 循环在 Shell 脚本中用于遍历一个列表或者数组中的元素,并执行相应的操作。它的基本语法结构如下:

    for item in [list]
    do
        # 在这里执行操作,可以使用 $item 变量来引用当前迭代的元素
    done
    
    
    1.item 是用于遍历列表中每个元素的临时变量。
    2.[list] 是要遍历的列表,可以是一系列字符串、文件名、数组等。
    
    示例:
    #!/bin/bash
    
    # 定义一个数组
    fruits=("apple" "banana" "orange" "grape")
    
    # 使用 for 循环遍历数组中的每个元素
    for fruit in "${fruits[@]}"
    do
        echo "I like $fruit"
    done
    

    for 循环遍历了数组 fruits 中的每个元素,并将每个元素赋值给变量 fruit,然后在循环体中打印出相应的语句。

    除了遍历数组,for 循环也可以用来遍历一个范围内的数字。例如:
    #!/bin/bash
    
    # 使用 for 循环打印数字 1 到 5
    for num in {1..5}
    do
        echo "Number: $num"
    done
    
    这将打印出数字 15

    Tips:比较$*$@区别。
    $*$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数。

    当它们被双引号“”包含时,$*会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;$@会将各个参数分开,以“$1” “$2”…“$n”的形式输出所有参数。


    while循环

    while 循环在 Shell 脚本中用于在给定条件为真时重复执行一系列命令。其基本语法结构如下:

    while [ condition ]
    do
        # 在这里执行操作,直到条件为假
    done
    
    
    1.condition 是一个表达式,通常是一个测试命令(如 test[)的条件。只要 condition 为真,循环就会继续执行。
    2.循环体中的命令将一直执行,直到 condition 变为假为止。
    
    示例
    #!/bin/bash
    
    # 初始化计数器
    count=1
    
    # 使用 while 循环打印数字 1 到 5
    while [ $count -le 5 ]
    do
        echo "Count: $count"
        # 增加计数器
        ((count++))
    done
    

    while 循环会持续执行,直到 $count 的值超过 5。每次循环迭代时,计数器 $count 的值会递增,并打印出当前的计数值。

    while 循环通常用于处理需要反复执行直到某个条件满足的情况,例如处理文件行或其他迭代操作。与 for 循环相比,while 循环更灵活,因为它可以根据条件的变化来动态控制循环的执行次数。


    5.读取控制台输入

    在 Shell 脚本中,read 命令用于从标准输入(通常是控制台)读取用户输入,并将其存储到一个变量中。

    这个命令在编写需要与用户进行交互的脚本时非常有用,例如要求用户输入信息或确认操作。

    read 命令的基本语法如下:
    read [options] variable_name
    
    
    1.options 是一些用于控制 read 命令行为的选项,例如超时时间等(可选)。
    2.variable_name 是存储用户输入的变量名。
    
    以下是一些 read 命令的常用选项:
    
    3.-p prompt_text:显示提示信息 prompt_text,然后等待用户输入。
    4.-r:防止对输入行进行反斜杠转义处理。
    5.-s:在用户输入时不回显(即不显示输入的内容),常用于输入密码等敏感信息。
    
    示例,如何使用 read 命令读取用户输入:
    #!/bin/bash
    
    # 提示用户输入姓名
    echo "Please enter your name:"
    read name
    
    # 提示用户输入密码,且不回显输入内容
    echo "Please enter your password:"
    read -s password
    
    # 输出用户输入的姓名和密码
    echo "Hello, $name! Your password is: $password"
    
    脚本会提示用户输入姓名和密码,并且密码输入时不会在屏幕上显示。然后,脚本会将用户输入的姓名和密码输出到控制台上。
    

    6.函数

    系统函数

    Shell脚本中的系统函数常指的是一系列内置的命令和工具,它们允许脚本与操作系统进行交互,并执行各种任务,如文件操作、字符串处理、系统管理等。

    
    文件和目录操作:
    
    cp:用于复制文件或目录。例如:cp file1 file2 将文件 file1 复制到 file2。
    mv:用于移动文件或目录。例如:mv file1 file2 将文件 file1 移动到 file2。
    rm:用于删除文件或目录。例如:rm file1 将删除名为 file1 的文件。
    mkdir:用于创建目录。例如:mkdir directory 将在当前目录下创建一个名为 directory 的目录。
    rmdir:用于删除目录。例如:rmdir directory 将删除名为 directory 的目录(如果目录为空)。
    touch:用于创建空文件或更新文件的访问和修改时间。例如:touch file1 将创建一个名为 file1 的空文件。
    cat:用于连接文件或标准输入并打印到标准输出。例如:cat file1 将打印 file1 文件的内容。
    echo:用于打印文本或变量到标准输出。例如:echo "Hello, world!" 将打印字符串 "Hello, world!"。
    grep:用于在文件中搜索匹配的文本行。例如:grep "pattern" file1 将在 file1 中搜索包含 "pattern" 的行。
    sed:用于基于正则表达式进行文本替换和处理。例如:sed 's/old/new/g' file1 将在 file1 中将所有 old 替换为 new。
    awk:用于处理文本和数据流的强大工具。例如:awk '{print $1}' file1 将打印 file1 中每行的第一个字段。
    
    
    系统管理:
    
    
    ps:用于列出当前运行的进程。例如:ps -aux 将显示所有进程的详细信息。
    top:用于显示运行中的进程和系统资源使用情况。例如:top 将显示当前系统资源使用情况和进程列表。
    kill:用于终止进程。例如:kill PID 将终止进程ID为 PID 的进程。
    shutdown:用于关闭或重启系统。例如:shutdown -r now 将立即重启系统。
    
    
    环境变量和用户信息:
    
    env:用于显示环境变量。例如:env 将显示当前所有的环境变量。
    export:用于设置环境变量。例如:export PATH=$PATH:/new/path 将向 PATH 环境变量中添加新路径。
    whoami:用于显示当前用户名。例如:whoami 将显示当前登录用户的用户名。
    hostname:用于显示系统主机名。例如:hostname 将显示当前系统的主机名。
    
    
    
    日期和时间:
    
    date:用于显示或设置系统日期和时间。例如:date 将显示当前日期和时间。
    

    Tips:

    1.basename:

    basename 命令用于从给定的路径中提取文件名部分。
    语法:basename path [suffix]
    参数 path 是要提取文件名的路径。
    可选参数 suffix 是要移除的文件后缀,如果不提供,则会返回完整的文件名。
    示例:
     
     basename /path/to/file.txt    # 输出: file.txt
     basename /path/to/file.txt .txt    # 输出: file
    

    2.dirname:

    dirname 命令用于从给定的路径中提取目录名部分。
    语法:dirname path
    参数 path 是要提取目录名的路径。
    示例:
     bash
     dirname /path/to/file.txt    # 输出: /path/to
    

    3.cut:

    通常用于从文本文件或标准输入中提取特定字段或字符。

    基本语法:
    cut OPTION... [FILE]...
    
    其中,OPTION 是一些用于指定切割条件的参数,FILE 是要处理的文件名。如果不指定 FILE,cut 将从标准输入读取数据。
    常见的 cut 命令选项包括:
    
    -f, --fields=LIST:指定要提取的字段列表。
    -d, --delimiter=DELIM:指定字段的分隔符,默认为制表符。
    -c, --characters=LIST:指定要提取的字符列表。
    -complement:补集,提取除指定字段/字符外的内容。
    -s, --only-delimited:仅显示包含分隔符的行。
    
    示例:
    
    提取文件中的字段:
    
       # 提取第一列
       cut -f1 file.txt
    
       # 提取第一列和第三列
       cut -f1,3 file.txt
    
       # 使用逗号作为分隔符
       cut -d',' -f1,3 file.csv
    
    
    提取文件中的字符:
    
       # 提取前5个字符
       cut -c1-5 file.txt
    
       # 提取第3个字符到文件末尾
       cut -c3- file.txt
    
    
    补集:
    
       # 提取除第一列以外的所有列
       cut -f1 --complement file.txt
    

    cut 命令非常适合用于对文本数据进行快速的字段提取和处理,特别是在处理 CSV 文件或者需要分析文本数据时。

    4.awk:

    在Shell脚本中,awk 是一个强大的文本处理工具,它允许用户根据特定的模式进行逐行处理和操作文本数据。

    语法:
    awk 'pattern { action }' file
    
    其中,pattern 是一个模式,用于匹配要处理的文本行,action 是一个动作,用于对匹配的行执行操作。
    
    file 是要处理的文件名,如果未指定文件名,则 awk 将从标准输入读取数据。
    

    awk 可以完成各种文本处理任务,包括过滤、格式化、计算等。

    1.打印指定列:
    
       awk '{ print $1 }' file.txt
    
    这将打印文件 file.txt 的第一列。
    
    2.打印满足条件的行:
    
       awk '/pattern/ { print }' file.txt
    
    这将打印文件 file.txt 中包含 pattern 的所有行。
    
    3.计算列的总和:
    
       awk '{ sum += $1 } END { print sum }' file.txt
    
    这将计算文件 file.txt 中第一列的总和,并将结果打印出来。
    
    4.自定义分隔符:
    
       awk -F',' '{ print $1 }' file.csv
    
    这将以逗号作为分隔符处理 file.csv 文件。
    
    5.自定义输出格式:
    
       awk '{ printf "Name: %s, Age: %d\n", $1, $2 }' file.txt
    
    这将按照指定的格式输出文件 file.txt 中的数据。
    

    awk 还支持更复杂的逻辑和操作,包括条件判断、循环等。它的强大之处在于可以在一行命令中完成许多常见的文本处理任务,使得它成为处理结构化文本数据的强大工具。

    后续会继续补充~


    自定义函数

    自定义函数是Shell脚本中的一种重要特性,允许开发者将一系列命令组织在一起,并为其指定一个名称,以便在脚本中重复使用。通过自定义函数,可以提高脚本的可读性、可维护性和复用性。

    1.定义函数:
    在Shell脚本中,使用 function 关键字或者简单地在函数名之前直接写函数名,来定义一个函数。函数的语法如下:
    
       function_name() {
           # 函数体,包含一系列命令
       }
    
    或者:
       function_name {
           # 函数体,包含一系列命令
       }
    
    例如:
       # 定义一个简单的打印欢迎消息的函数
       welcome() {
           echo "Welcome to my blog!"
       }
    
    
    2.调用函数:
    要调用自定义函数,只需在脚本中使用函数名称即可。例如,对于上面定义的 welcome 函数,可以这样调用它:
    
       welcome
    
    
    3.传递参数:
    函数可以接受参数,在函数内部使用特殊变量 $1$2 等来访问传递给函数的参数。例如:
    
       greet() {
           echo "Hello, $1!"
       }
       greet "yushifu"
    
    这将输出:Hello, yushifu!
    
    4.返回值:
    函数可以通过 return 语句返回一个值给调用者。例如:
    
       add() {
           local result=$(( $1 + $2 ))
           return $result
       }
       add 3 5
       sum=$?
       echo "Sum: $sum"
    
    这将输出:Sum: 8
    

    Tips:

    • (1)在调用函数地方之前,必须先声明函数。shell脚本是逐行运行,不会像其它语言一样先编译。
    • (2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)。

    7.正则表达式

    在Shell脚本中,正则表达式常用于文本处理,包括匹配、查找、替换等操作。

    • .:匹配任意单个字符,除了换行符。
    示例:a.c 可以匹配 abc、adc、a1c 等。
    
    • *:匹配前一个字符的零个或多个实例。
    示例:a* 可以匹配 a、aa、aaa 等。
    
    • +:匹配前一个字符的一个或多个实例。
    示例:a+ 可以匹配 a、aa、aaa 等,但不能匹配空字符串。
    
    • ?:匹配前一个字符的零个或一个实例。
    示例:a? 可以匹配 a 或空字符串。
    
    • [ ]:匹配括号内的任意一个字符。
    示例:[abc] 可以匹配 a、b 或 c。
    [6,8]------匹配6或者8
    [0-9]------匹配一个0-9的数字
    [0-9]*------匹配任意长度的数字字符串
    [a-z]------匹配一个a-z之间的字符
    [a-z]* ------匹配任意长度的字母字符串
    [a-c, e-f]-匹配a-c或者e-f之间的任意字符
    
    • [^]:否定匹配,匹配除了括号内指定字符之外的任意字符。
    示例:[^abc] 可以匹配除了 a、b、c 之外的任意字符。
    
    • ^:匹配行的开头。
    示例:^abc 匹配以 abc 开头的行。
    

    $:匹配行的结尾。

    示例:abc$ 匹配以 abc 结尾的行。
    
    • \:转义字符,用于匹配特殊字符。
    示例:\. 可以匹配点号 .。
    
    • ():分组,用于限定匹配范围。
    示例:(abc)+ 可以匹配 abc、abcabc、abcabcabc 等。
    

    在这里插入图片描述

  • 相关阅读:
    使用Lua编写Wireshark解析ProtoBuf插件
    Auto.js中的控制台相关命令
    插件化原理
    C语言:二维数组的传递
    第7章 - 多无人机系统的协同控制 --> 多无人机协同控制
    数字视频测量应用技术(基础篇)
    如何切换npm源 - nrm
    浅谈react-redux
    < Python全景系列-4 > 史上最全文件类型读写库大盘点!什么?还包括音频、视频?
    统计遗传学:第五章,多基因评分PGS
  • 原文地址:https://blog.csdn.net/weixin_48935611/article/details/139420494