• shell脚本操作


    Shell文件语言

    终端打印输出用echo指令

    echo "hello world"
    

    变量

    1 . 变量名必须是字母(a-z,A-Z) + 下划线_

    2 . 变量名中不能有标点符号

    3 . 变量名中不能有空格

    变量输出需要加$符号,但是=是不能加空格的

    name="smile2017"
    #错误的形式 加了空格
    name = "smile2017" 
    

    只读变量

    关键字 readonly

    name="leon"
    
    #只读name属性
    readonly name
    
    #会报错,不会打印
    name="sisi"
    
    echo $name
    
    #打印
    ./hello.sh: line 19: name: readonly variable
    

    删除变量

    关键字 unset

    name="Andy"
    
    #打印name
    echo $name
    
    #删除name
    unset name
    
    echo $name
    

    变量类型

    类型一:本地变量,作用域整个bash进程可以使用,语法:name="leon"
    类型二:局部变量,作用域是当前代码块,用关键字local去修饰,语法:local name= "Andy"
    类型三:环境变量,作用域当前shell进程以及子进程,语法:export name="Andy"
    类型四:位置变量,${0},${1}等来填入输入不同变量。语法:name=${0},age=${1},echo "姓名${nane},年龄${age}"
    例如:

    #!/bin/bash
    name=${1}
    age=${2}
    sex=${3}
    echo"姓名:${name},年龄:${age},性别:${sex}"
    
    最后执行脚本 执行脚本时写入变量
    ./hello.sh Jeff 150 男
    
    #文件名称为${0},所以第一个参数从${1}开始
    

    特殊变量

    类型
    $(0)->特殊变量->文件名称
    $(?)->表示返回上一个命令执行状态返回值->0:表示执行成功,1:程序执行结果,2表示程序状态码返回(0-255)
    $(#)->参数个数
    $(*)->参数列表
    $(@)->参数列表
    $($)->参数当前shell的PID
    $(!)->执行上一个指令的PID

    $(*)$(@)的区别在于$(*)会将所有的参数组合成字符串输出,而$(@)会将参数一个一个输出。

    字符串

    字符串表示:
    单引号或者双引号表示

    字符串的拼接:
    1. 直接用 ${name}${age}${sex}
    2. 在变量中用引号info="姓名:"${name}" 年龄:${age}"

    获取字符串长度:
    在变量名前面直接加上#
    eg:name=andy echo=${#name}

    字符串截取
    例如:

     name="leon is good boy"
     
     #从下标为2的字符串开始开始截取3位
     result=${name:2:3}
     
     #从字符串第5位开始截取,到最后一位
     #方式一:
     length=${#name}-1
     result1=${name:2:lenght}
     
     #方式二:默认后面直接到最后一个
     result2=${name:2}
    

    字符串删除
    ${变量名#删除的字符串 正则表达式}

    #匹配不到
    name="i have a dream"
    result=${name#dream}
    echo ${result}
    
    #默认从左到右匹配查询删除,不然就匹配不到
    result1=${name#I}
    echo ${result1}
    
    #查找指定字符的第一个,并且删除前面所有的字符,并且包含自己
    result2=${name#*D}
    echo ${result2}
    
    #指定删除范围
    result3=${name#I*D}
    echo ${result3}
    
    #如果从右边开始检查就用##
    reslut4=${name##*a}
    echo ${reslut4}
    
    #从字符串结尾开始匹配用%
    result5=${name%m}
    echo ${reslut5}
    
    #查找指定字符的第一个,删除所有字符(包含自己)
    result6=${name%h*}
    echo ${result6}
    
    #删除指定范围
    result7=${name%a*m}
    echo ${result7}
    
    ##方向从左往右
    result8=${name%%a*m}
    echo ${result8}
    

    Shell语言的echo命令

    我们都知道echo是打印输出的意思,那么echo可以怎么实现输入呢

    1. 显示普通的字符串,例如:echo "iPhoneX 标配8888"
    2. 显示转义字符,例如:echo "iPhone 顶配 10000"
    3. 显示变量,例如:iphone="iphoneX" echo "${iphone} 9888"
    4. 显示换行,必须要用-e来开启转义功能,例如:echo -e "iphoneX hello 未来"
    5. 不换行,不换行用c表示,例如:echo -e iPhoneX hello未来 c echo"科技"
    6. 显示一个执行命令,例如要求输入当前时间,用date
    7. 退出命令,exit 状态(详见下方的状态表),如果一旦执行了exit之后,后面的语句就不会继续执行了。
    8. 重定向

    关于状态码:

    状态码 描述
    0 命令执行成功
    1 一般性未知错误
    2 不适合的shell命令
    126 命令不可执行
    127 没有找到命令
    130 通过ctrl+c终止的命令
    255 正常范围内推出的状态码

    Shell语言的数组

    语法

    数组名=(值1 值2 值3...)
    

    初始化

    方式一:

    name=("404" "andy" "hello" "world")
    

    Shell

    方式二:

    name=()
    name[1]="404"
    name[2]="andy"
    name[3]="hello"
    name[4]="world"
    

    Shell

    读取数组

    @或者*来输出所有的数组元素,但是@是将元素一个一个输出,*是将数组内元素组合成一个字符串输出。这点需要注意。

    echo ${name[*]}
    echo ${name[@]}
    

    数组长度

    之前说了在输出前面加#是输出字符串长度,这里同样适用于数组,在获取所有元素之后之后在数组前面加上#,如果是*的话,#同样适用,可以很智能的识别空格来进行对元素长度的识别解析。

    echo ${#name[@]}
    echo ${#name[*]}
    

    如果需要获取单个元素字符长度我们则可以用具体的下标

    echo ${#name[3]}
    

    Shell语言的传递参数

    语法定义:(终端输入)

    ./文件名称.sh 参数一 参数二 参数三

    获取参数:

    之前字符串章节说过用${1},${2}...表示,需要注意的是${0}表示文件名称

    echo ${1} ${2} ${3}
    

    Shell

    复制

    特殊字符

    获取脚本输入参数个数

    echo ${#}
    

    Shell

    复制

    获取参数列表

    echo ${*}
    

    Shell语言的基本运算符

    基本运算符

    基本运算符就是我们所称的+ - * / %

    a=1234
    b=3214
    c=`expr $a + $b`
    

    Shell

    可以注意到,在shell语言中,单纯的元素相加不能直接用+,而是必须要用expr去计算两个变量的值。而且如果调用,后面的变量名称和+之间必须要加上空格来保证变量的独立性。否则则会当成字符串输出。
    

    注意:当且仅当用乘法的时候必须加上一个转义字符

    a=1234
    b=3214
    c=`expr $a * $b`
    

    Shell

    赋值运算符

    =
    这个符号就很简单了,就不在做阐述了

    关系运算符

    一张表格阐述

    布尔运算符

    一张表格阐述

    逻辑运算符

    一张表格阐述

    字符串运算

    一张表格阐述

    文件测试运算符

    一张表格阐述

    循环控制语句

    if-else

    语法结构

    if [条件]
        then
            代码
    else if [条件]
        then
            代码
    else
            代码
    fi
    

    Shell

    记住判断最后要以fi结尾

    例如我们来判定一个学生是不是男生:

    sex="man"
    
    if [ $sex = "man" ]
    then
        echo "男生"
    else
        echo "女生"
    fi
    

    for

    语法结构

    for 变量名 in item1 item2 item3 …
        do
            代码
        done
    

    比如我们要循环打印一个数组中的元素:

    names=("张三" "李四" "王五")
    for i in ${names[@]}
    do
        echo ${i}
    done
    

    while

    语法结构

    while(条件)
        do
            代码
        done
    

    Shell

    假设我们要一直循环直到while条件不成立

    a=1
    while(($a<10))
    do
        echo ${a}
        a=`expr $a + 1`
    done
    

    case

    case

    语法结构

    case 值 in
        模式1)
            代码
            ;;
        模式2)
            代码
            ;;
        模式3)
            代码
            ;;
        sac
    

    判断number的值

    number=1
    case $number in
    1) echo "等于1"
        ;;
    2) echo "等于2"
        ;;
    3) echo "等于3"
        ;;
    esac
    
  • 相关阅读:
    SNOI 2019 字符串
    1068: [SCOI2007]压缩
    POJ 1848 Tree 树形DP
    BZOJ bzoj1396 识别子串
    BZOJ 4503: 两个串
    BZOJ 2302: [HAOI2011]Problem c(数学+DP)
    BZOJ 3157: 国王奇遇记 (数学)
    CF_528D
    BZOJ 3000: Big Number (数学)
    新の开始
  • 原文地址:https://www.cnblogs.com/cjh1996/p/12881404.html
Copyright © 2020-2023  润新知