美文网首页
shell知识点汇总

shell知识点汇总

作者: Stay_Hungry_Fly | 来源:发表于2018-09-28 19:21 被阅读43次

    1. bash和source

    • bash命令执行.sh文件会新开启子进程运行
    • 用source执行.sh文件是在当前进程中运行
    • source 命令执行.sh文件后加载了.sh文件的环境或者变量,可以直接在当前环境下使用

    2. 脚本开发规范

    • #! /bin/bash必须在首行
    • #!称为shebang
    • 注释
      单行注释: 只要首个字符是#,那么就表示该行是注释(除首行)
      多行注释(两种):
      :<<! ...(中间是内容) !

      :<<任意字符 ...(中间是内容) 对应任意字符
    • 尽量不用中文注释
    • 脚本执行方式
      bash /path/to/script-name 或 /bin/bash /path/to/script-name (强烈推荐使用)
      /path/to/script-name 或 ./script-name (当前路径下执行脚本)
      source script-name 或 . script-name (注意“.“点号后面有空格)

    3. 声明临时全局变量

    • 通过如下方式声明与使用
      export name
      env | grep name

    4. shell与shell脚本的定义

    shell的定义

    • 在计算机科学中,Shell就是一个命令解释器。
    • shell是位于操作系统和应用程序之间,是他们二者最主要的接口,shell负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。
      shell脚本的定义
    • 当可执行的Linux命令或语句不在命令行状态下执行,而是通过一个文件执行时,我们将这个文件为shell脚本。

    5. 查看当前系统的shell类型

    echo $SHELL

    6. 创建临时脚本

    创建linshi.sh

    #!/bin/bash
    # 这是临时shell脚本
    echo 'nihao'
    echo 'itcast'
    

    执行(终端输入bash linshi.sh)结果如下

    nihao
    itcast
    

    7. shell中的变量

    ​ 本地变量

    • 在当前系统的某个环境下才能生效的变量,作用范围小; 包括普通变量和命令变量
    • 普通变量:
      常用数字不加引号,其他默认加双引号
      变量名="变量值"
      如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,
      ​ 重新赋值给变量B
    • 命令变量
      变量名=(命令) 执行流程: ​ 1、执行`或者()范围内的命令
      ​ 2、将命令执行后的结果,赋值给新的变量名A
      全局变量
    • 在当前系统的所有环境下都能生效的变量
    • 环境是:每打开一个终端是一个shell环境,使用非source执行方式时,会开启子进程,也是一个shell环境,称为子shell环境。
    • 查看全局变量
      env # 只显示全局变量,主要是加载了~/.bashrc和/etc/profile文件
    • 定义全局变量
    方法一:
    变量名=值
    export 变量
    方法二:(最常用)
    export 变量名=值
    
    • 总结:在终端中定义全局变量时,只对当前shell环境及子shell环境有效,对新开的终端无效,当前终端关闭后,它定义的全局变量消失。

    • 查看变量

    方式一:
    ​ $变量名
    方式二:
    ​ "$变量名"
    方式三:
    ​ ${变量名}
    方式四:标准使用方式
    ​ "${变量名}"
    
    • 取消变量
      unset 变量名

    shell内置变量
    ~! 和脚本有关的

    • $0 获取当前执行的shell脚本文件名
    • $$ 获取执行shell脚本的进程号
    • n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来{10}
    • $# 获取当前shell命令行中参数的总个数
    • $? 获取执行上一个指令的返回值(0为成功,非0为失败)
      $$$
    • 字符串精确截取
      格式:${变量名:起始位置:截取长度}
    ${file:0:5}       从第1个字符开始,截取5个字符
    ${file:5:5}       从第6个字符开始,截取5个字符
    ${file:0-6:3}     从倒数第6个字符开始,截取之后的3个字符
    
    • 默认值相关
      情况一
    ​ 变量a如果有内容,那么就输出a的变量值
    ​ 变量a如果没有内容,那么就输出默认的内容
    ​ 格式:
         ${变量名:-默认值}
    

    情况二

    无论变量a是否有内容,都输出默认值
    ​ 格式:
        ${变量名+默认值}
    

    8. 测试语句

    条件表达式两种形式
    a test 条件表达式
    b [ 条件表达式 ]
    [ ]与内部的条件表达式之间需要有空格;
    test跟 [ ] 都是用于测试条件表达式是否成立,条件成立,状态返回值是0,条件不成立,状态返回值是1
    条件表达式

    • 逻辑表达式
      命令1 && 命令2
      a 如果命令1执行成功,那么执行命令2
      b 如果命令1执行失败,那么不执行命令2
      [ 1 = 1 ] && echo "条件成立"
      命令1 || 命令2
      a 如果命令1执行成功,那么不执行命令2
      b 如果命令1执行失败,那么执行命令2
      [ 1 = 2 ] || echo "条件不成立"

    • 文件表达式
      -f 判断输入内容是否是一个文件
        [ -f weizhi.sh ] && echo "是一个文件"
      -d 判断输入内容是否是一个目录
         [ -d weizhi.sddh ] || echo "不是一个目录"
      -x 判断输入内容是否可执行
        [ -x age.sh ] || echo "文件没有执行权限"

    • 数值操作

    n1 -eq n2 相等
    n1 -gt n2 大于
    n1 -ge n2 大于等于
    n1 -lt n2 小于
    n1 -lte n2 小于
    n1 -ne n2 不等于 字符串比较
    

    计算表达式

    • $(( 计算表达式 ))

    $(())中只能用+-*/和()运算符,并且只能做整数运算

    • let 计算表达式

    9. linux常见符号

    • |
      使用格式: 命令1| 命令2
      管道符左侧命令1执行后的结果作为输入传递给右侧的命令2使用
      env | grep SHELL

    • > >>
        在shell脚本中有两种常见的重定向符号 > 和 >>
        echo "file1.txt" > file.txt将file1.txt字符串覆盖写入file.txt文件
        echo "file1.txt" >> file.txt将file1.txt字符串追加写入到file.txt文件

    • &
      后台展示符号 &(跟在一条命令之后,将一个命令从前台转到后台执行)
      在命令之后添加 &开启一个新的进程执行,不影响当前进程的操作
      sleep 10 &

    • 2>&1
        全部信息符号 2>&1 符号详解: 1 表示标准输出的信息 2 表示标准错误的信息 2>&1 代表所有输出的信息
        标准正确输出示例cat nihao.txt 1>> zhengque
        标准错误输出示例(不存在itcast命令,会报错)itcast 2>> errfile
        将1重定向到ceshi-ok,将2重定向到ceshi-errbash ceshi.sh 1>> ceshi-ok 2>> ceshi-err

    • linux系统垃圾桶
        /dev/null是linux下的一个设备文件,这个文件类似于一个垃圾桶,很多不重要的信息可以指向向其重定向
      特点是:容量无限大

    • grep文本搜索命令
      格式grep [参数] [关键字] <文件名>
       参数详解:
        -c:只输出匹配行的计数。 grep -c aaa find.txt
        -n:显示匹配行及行号。 grep -n CCC find.txt
        -v:显示不包含匹配文本的所有行。 grep -v ni find.txt

    sed 行文件编辑工具
      命令格式: sed [参数] '<匹配条件> [动作]' [文件名]

    • -i 表示对文件进行编辑(不添加-i参数,修改操作结果直接往屏幕输出,不修改原文件)
      动作详解
        -a 在匹配到的内容下一行增加内容
        -i 在匹配到的内容上一行增加内容
        -d 删除匹配到的内容
        -s 替换匹配到的内容
      注意:上面的动作应该在参数为-i的时候使用,不然的话不会修改原文件

    - 替换操作
    命令格式:sed -i [替换格式] [文件名]
    替换格式:'s#原内容#替换后内容#'
      替换首每行的第1个sed为SEDsed -i 's#sed#SED#' sed.txt
      替换全部sed为dessed -i 's#sed#SED#g' sed.txt
      替换第2行的首个SED为sedsed -i '2s#SED#sed#' sed.txt
      替换每行的第2个SED为sedsed -i 's#SED#sed#2' sed.txt
      替换第3行的第2个SED为sedsed -i '3s#SED#sed#2' sed.txt

    • 追加操作
        格式:sed -i '行号a\增加的内容' 文件名
        注意:如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开
        指定行号增加内容sed -i '2a\zengjia-2' sed.txt
        指定1~3每行都增加内容sed -i '1,3a\tongshi-2' sed.txt
    • 插入操作
        在指定行号的当行增加内容
        格式:sed -i '行号i\增加的内容' 文件名
        注意:如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开
        指定行号增加内容sed -i '1i\insert-1' sed.txt
    • 删除操作
        作用:指定行号删除
        格式:sed -i '行号d' 文件名
        注意:如果删除多行,可以在行号位置多写几个行号,彼此间使用逗号隔开
        删除第4行内容sed -i '4d' sed.txt
        删除多行(3-5行)内容sed -i '3,5d' sed.txt

    awk命令详解
      命令格式: awk [参数] '[ 动作]' [文件名]

    • 常见参数:
        -F 指定行的分隔符
    • 常见动作:
         print 显示内容
        $0 显示当前行所有内容
        $n 显示当前行的第n列内容,如果存在多个$n,它们之间使用逗号(,)隔开
    • 常见内置变量
        FILENAME 当前输入文件的文件名,该变量是只读的
        NR 指定显示行的行号
        NF 输出 最后一列的内容
        OFS 输出格式的列分隔符,缺省是空格
        FS 输入文件的列分融符,缺省是连续的空格和Tab 模板文件内容
      示例:
        打印第1列的内容awk '{print $1}' awk.txt
        打印第一行第1和第3列内容awk 'NR==1 {print $1,$3}' awk.txt
        指定隔离分隔符,查看内容cat linshi.txt
        设置显示分隔符,显示内容awk 'BEGIN{OFS=":"} {print NR,$0}' awk.txt

    find命令详解
      命令格式: find [路径] [参数] [关键字] 参数详解
      -name 按照文件名查找文件。
      -perm 按照文件权限来查找文件。
      -user 按照文件属主来查找文件。
      -group 按照文件所属的组来查找文件。
      -type 查找某一类型的文件
      -size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
      -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
      -mindepth n:在查找文件时,查找当前目录中的第n层目录的文件,然后再在其子目录中查找。
      ! : 表示取反 命令演示: 在当前系统中查找一个叫awk的文件

    10. 流程控制

    简单流程控制语句

    *** 简单流程控制语句***

    • 单分支if语句
        语法格式
    if [ 条件 ]
    then
         指令
    fi
    

    示例(bash xxx.sh 参数):

    #!/bin/bash
    # 单if语句的使用场景
    if [ "$1" == "nan" ]
    then
       echo "您的性别是 男"
    fi
    
    • 多分支if语句
    if [ 条件 ]
    then
         指令1
    elif [ 条件2 ]
    then
        指令2
    else
        指令3
    fi
    

    示例

    多分支if语句示例(bash xxx.sh  参数)
    #!/bin/bash
    # 单if语句的使用场景
    if [ "$1" == "nan" ]
    then
       echo "您的性别是 男"
    elif [ "$1" == "nv" ]
    then
       echo "您的性别是 女"
    else
       echo "您的性别,我不知道"
    fi
    

    应用

    admin-1@ubuntu:/data/scripts/python-n# cat if.sh
    #!/bin/bash
    # 多if语句的使用场景
    if [ "$1" == "start" ]
    then
       echo "服务启动中..."
    elif [ "$1" == "stop" ]
    then
       echo "服务关闭中..."
    elif [ "$1" == "restart" ]
    then
       echo "服务重启中..."
    else
       echo "$0 脚本的使用方式: bash $0 [ start | stop | restart ]"
    fi
    
    • case语句
      case语句格式
    case 变量名 in
       值1)
          指令1
             ;;
       ...
       值n)
         指令n
             ;;
    esac
    

    示例

    # cat case.sh
    #!/bin/bash
    # case语句使用场景
    case "$1" in                 
        "start")                 
            echo "服务启动中..."                  
            ;;                  
        "stop")                 
            echo "服务关闭中..."                  
            ;;                          
        "restart")                   
            echo "服务重启中..."             
            ;;                  
        *)                 
            echo "$0 脚本的使用方式:bash $0 [ start | stop | restart ]"      
            ;;                  
    esac
    
    
    • for循环语句
      示例:遍历文件
    #!/bin/bash
    # for语句的使用示例
    for i in $(ls /root)
    do
      echo "${i}"
    done
    
    • while循环语句
      while语句示例
    #!/bin/bash
    # while的示例
    a=1
    while [ "${a}" -lt 5 ]
    do
       echo "${a}"
       a=$((a+1))
    done
    
    • until循环语句
      until语句示例
    #!/bin/bash
    # until的示例
    a=1
    until [ "${a}" -eq 5 ]
    do
       echo "${a}"
       a=$((a+1))
    done
    

    函数基础知识

    • 简单函数定义和调用示例
    #!/bin/bash
    # 函数使用场景一:执行频繁的命令
    dayin(){
      echo "wo de mingzi shi  111"
    }
    # 调用
    dayin
    
    • 函数传参和函数体内调用参数示例
    #!/bin/bash
    dayin(){
      echo "wo de mingzi shi $1"
    }
    # 调用函数传参
    dayin 111
    
    • 脚本传参, 函数调用
    #!/bin/bash
    # 定义传参数函数
    dayin(){
      echo "wode mignzi shi $1"
    }
    # 调用函数传参
    dayin $1
    
    • 脚本传参,函数调用(生产用)
    #!/bin/bash
    # 函数的使用场景二
    canshu = "$1"
    dayin(){
      echo "wo de mingzi shi $1"
    }
    # 调用函数传参
    dayin "${canshu}"
    

    11. 代码发布

    12. 环境部署

    基础环境

    创建基本目录
    mkdir /data/{server,logs,backup,softs,virtual,scripts,codes} -p

      1. 修改root用户权限,使其可以远程被访问
      • 切换到root用户
      • cd /etc/ssh
      • vi sshd_config
      • 将注释掉的...
      1. 做主机间免密码认证需要做三个动作
      • 本机生成密钥对
      • 对端机器使用公钥文件认证
      • 验证

    相关文章

      网友评论

          本文标题:shell知识点汇总

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