• linux安装软件配置


    CentOS7更换yum为阿里源 

    1 备份本地源
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

    2 获取阿里源配置文件
    CentOS 6
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo
    或者
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo

    CentOS 7
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    或者
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

    CentOS 8
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
    或者
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo

    3 更新cache
    yum makecache

    4 其他
    非阿里云ECS用户会出现 Couldn't resolve host 'mirrors.cloud.aliyuncs.com' 信息,不影响使用。用户也可自行修改相关配置: eg:

    sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
    然后执行 yum clean all,再次执行 yum makecache 重新缓存

    部署hadoop集群环境前的准备

     

    本文使用Linux版本为centos7,准备3个节点,来部署hadoop集群前要做一些准备工作
    具体分配规划如下所示:

    |   节点名称    |     节点IP        |
    | ----------|------------|
    | hadoop01    | 192.168.56.10  |
    | hadoop02    | 192.168.56.20  |
    | hadoop03    | 192.168.56.30  |
    
    
    使用终端工具secureCRT链接上3台机器,切换成root用户进行如下配置:
    
    1. 关闭防火墙
      systemctl stop firewalld #关闭防火墙
      systemctl disable firewalld #禁止防火墙启动

    2. 关闭selinux
      编辑 /etc/sysconfig/selinux 文件 ,修改SELINUX=disabled

    3. 修改主机名称
      编辑 /etc/hostname文件,3台机器分别修改成自己规划的名称
      第一台 hadoop01
      第二台 hadoop02
      第三台 hadoop03

    4. 修改主机映射文件和名称

      编辑 /etc/hosts文件,添加其他机器的配置信息到映射文件里
      192.168.56.10 hadoop01
      192.168.56.20 hadoop02
      192.168.56.30 hadoop03

    5. 同步三台机器时间,使用阿里云时间同步器
      三台机器都安装ntpdate
      yum -y install ntpdate

      阿里云时钟同步服务器
      ntpdate ntp4.aliyun.com

      创建一个定时任务,这样就可以自动帮我们同步到阿里云的时钟服务的时间
      crontab -e

    */1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;

    1. 添加一个专门用来处理大数据相关的用户,例如我们设置账号为hadoop ,密码为123456,那就分别在3台机器上进行如下操作:
      useradd hadoop
      passwd hadoop,输入一个密码,123456
      新增用户,添加root权限,省去执行权限问题
      visudo
      新增如下内容
      hadoop ALL=(ALL) ALL

    我们为这个账号创建2个文件夹,方便以后我们对的工具或者代码的管理,例如我们在根目录创建一个bigdata文件夹,
    下边创建一个soft,用于放置我们上传的安装包,代码等。再创建一个install,用于放置我们安装的软件。
    注意要对这2个文件夹分配所属人到我们新增加的账户 hadoop
    mkdir -p /bigdata/soft
    mkdir -p /bigdata/install
    chown -R hadoop:hadoop /bigdata
    
    1. 免密登陆准备
      由于是3台服务搭建集群,hadoop启动以后,namenode是通过SSH(Secure Shell)来启动和停止各个节点上的各种守护进程的,所以我们需要配置一下免密登陆
      三台机器上都生成密钥信息
      ssh-keygen -t rsa,然后是3个回车Enter

      现在是3台机器都生成了各自的密钥,我们在其中1台上复制粘贴其他2台的密钥,我们3台都同时执行下边命令来进行复制
      ssh-copy-id hadoop01
      然后在复制这个密钥文件到其他2台就可以实现3台有相同的密钥文件
      scp authorized_keys hadoop02:$PWD
      scp authorized_keys hadoop03:$PWD

      验证一把,在hadoop01上输入ssh hadoop02,查看是否当前机器变成了hadoop02

    2. 安装JDK
      我们将本地的jdk文件上传到hadoop01,并对其进行解压和配置profile文件
      cd /bigdata/soft
      tar -zxf jdk-8u141-linux-x64.tar.gz -C /bigData/install

      将hadoop01机器上的jdk复制到其他机器上去
      scp -r /bigdata/install/jdk1.8.0_141 hadoop@hadoop02:/bigdata/install
      scp -r /bigdata/install/jdk1.8.0_141 hadoop@hadoop03:/bigdata/install

      编辑配置文件,执行命令 sudo vim /etc/profile

      export JAVA_HOME=/bigdata/install/jdk1.8.0_141
      export PATH=$PATH:$JAVA_HOME/bin

      激活一下profile文件 source /etc/profile

    ~/.bash_profile失效

     

    环境变量准备

    在~/.bash_profile下配置了环境变量相关的路径信息,比如$HOME/bin路径。就是说会把$HOME/bin目录下的命令添加到环境变量中去。

    # .bash_profile
    
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
            . ~/.bashrc
    fi
    
    # User specific environment and startup programs
    
    PATH=$PATH:$HOME/.local/bin:$HOME/bin
    export PATH
    
    交代一下背景情况:

    创建了一台虚拟机,里面有多个账户,比如有tenic/hadoop账户,在hadoop账户下边的$HOME目录下的bin文件夹下创建了一个命令,
    且命令有在hadoop用户的~/.bash_profile中定义环境变量到相应的bin路径。
    使用secureCRT/xshell登录到虚拟机时使用的是tenic,然后切换到hadoop用户。执行hadoop用户bin目录下的命令时,提示命令不存在的问题。

    解决方法一:

    su 是最简单的用户切换命令,通过该命令可以实现任何身份的切换,包括从普通用户切换为 root 用户、从 root 用户切换为普通用户以及普通用户之间的切换。
    我们看一下su的帮助信息

    hadoop@hadoop01 ~]$ su --help
    
    Usage:
     su [options] [-] [USER [arg]...]
    
    Change the effective user id and group id to that of USER.
    A mere - implies -l.   If USER not given, assume root.
    
    Options:
     -m, -p, --preserve-environment  do not reset environment variables
     -g, --group <group>             specify the primary group
     -G, --supp-group <group>        specify a supplemental group
    
     -, -l, --login                  make the shell a login shell
     -c, --command <command>         pass a single command to the shell with -c
     --session-command <command>     pass a single command to the shell with -c
                                     and do not create a new session
     -f, --fast                      pass -f to the shell (for csh or tcsh)
     -s, --shell <shell>             run shell if /etc/shells allows it
    
     -h, --help     display this help and exit
     -V, --version  output version information and exit
    
    For more details see su(1).
    

    从帮助文档中可以看到,su后边可以添加多个可选入参,其中有一个 [-] 表示shell也跟着一起变更,
    也就是说使用 [-] 选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。

    解决方法二:

    我们在2个用户的/.bashrc文件下添加一个echo语句,可以查看到,当切换用户不使用[-]时,会加载切换用户的/.bashrc环境变量,
    所以我们可以在~/.bashrc文件中添加上我们想要添加的环境变量。如下边的图所示:


    我们在我们想要切换的用户的~/.bahsrc中添加上相应的环境变量路径上去就可以了。

    从我们打印出的$PATH路径可以看出,目前环境变量信息已经添加上我们切换用户的路径了。

    centos7 安装docker

     

    1.卸载系统自带的docker软件

    sudo yum remove docker \
                    docker-client \
                    docker-client-latest \
                    docker-common \
                    docker-latest \
                    docker-latest-logrotate \
                    docker-logrotate \
                    docker-engine
    

    2.按装docker必须依赖的包

    sudo yum install -y yum-utils \
                        device-mapper-persistent-data \
                        lvm2 
    

    3.添加docker仓库信息

    sudo yum-config-manager \
        --add-repo \
        http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    

    4.安装docker engine-community

    sudo yum install docker-ce docker-ce-cli containerd.io
    

    如果提示您接受GPG密码,输入y

    5.添加镜像加速地址(可以找阿里云获取其他平台的镜像加速地址)

    sudo makdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    	"registry-mirrors":["https://xxxxx.mirror.aliyuncs.com"]
    }
    EOF
    
    SHELL 复制 全屏

    6.启动docker,并设置为开机启动

    sudo systemclt start docker
    sudo systemctl enable docker

    docker安装nginx和tomcat

     
    1. 下载nginx和tomcat的镜像信息
    docker pull nginx
    docker pull tomcat
    
    1. 创建nginx和tomcat需要挂载的目录
    mkdir -p /bigdata/install/nginx/www /bigdata/install/nginx/conf/ /bigdata/install/nginx/logs
    mkdir -p /bigdata/install/tomcat/webapps1/ROOT \
    	 /bigdata/install/tomcat/webapps2/ROOT \
             /bigdata/install/tomcat/logs/log1 \
             /bigdata/install/tomcat/logs/log2
    
    1. 启动2台tomcat 作负载均衡
    docker run --name tomcat1 \
    -v /bigdata/install/tomcat/webapps1:/usr/local/tomcat/webapps \
    -v /bigdata/install/tomcat/logs/log1:/usr/local/tomcat/logs \
    -d tomcat
    docker run --name tomcat2 \
    -v /bigdata/install/tomcat/webapps2/:/usr/local/tomcat/webapps \
    -v /bigdata/install/tomcat/logs/log2:/usr/local/tomcat/logs \
    -d tomcat
    
    1. 获取tomcat容器的ip信息
    docker inspect tomcat1|grep "IPAddress"
    docker inspect tomcat2|grep "IPAddress"
    
    1. 配置nginx.conf
    cd /bigdata/install/nginx/conf
    vi nginx.conf
    
    ##复制如下内容到文件中去
    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        upstream tomcat {
            server 172.17.0.2:8080;##上一步查到的IP和端口
            server 172.17.0.3:8080;##上一步查到的IP和端口
        }
    
        server {
            listen 80;
            server_name localhost;
    
            location / {
                proxy_pass http://tomcat/;
                proxy_redirect off;
                index index.html index.htm;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Real-Port $remote_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
        include /etc/nginx/conf.d/*.conf;
    }
    
    1. 启动nginx
    docker run -p 80:80 --name nginx \
    -v /bigdata/install/nginx/www:/usr/share/nginx/html \
    -v /bigdata/install/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v /bigdata/install/nginx/logs:/var/log/nginx \
    -d nginx
    
    1. 添加静态页面,区分不同的tomcat
    cd /bigdata/install/tomcat/webapps1/ROOT
    vi index.html
    
    ##复制以下内容,贴入文件
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>docker deployment</title>
    </head>
    <body>
        <h1>hello, world!--by tomcat1</h1>
        <h1>hello, tenic</h1>
    </body>
    </html>
    
    tomcat2的配置页面同理,只是将tomcat1修改为tomcat2
    
    1. 访问页面,可以看到有2个页面在替换

    shell定时上传linux日志信息到hdfs

     

    从标题可以分析出来,我们要使用到shell,还要推送日志信息到hdfs上。

    1. 定义出上传的路径和临时路径,并配置好上传的log日志信息。
      这里我使用了上一节配置的nginx的error.log
    #上传log日志文件的存放路径
    /bigdata/logs/upload/log/
    #上传log日志文件的临时路径
    /bigdata/logs/upload/templog/
    

    将nginx的error.log放在上传log日志的文件夹下边,如下图所示

    1. 在~/bin目录下创建我们的shell脚本文件
    vi uploadFileToHdfs.sh
    
    ##复制如下内容,并保存退出
    #!/bin/bash
    
    #set java env
    export JAVA_HOME=/bigdata/install/jdk1.8.0_141
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
    
    #set hadoop env
    export HADOOP_HOME=/bigdata/install/hadoop-3.1.4
    export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
    
    
    #日志文件存放的目录
    log_src_dir=/bigdata/logs/upload/log/
    
    #待上传文件存放的目录
    log_toupload_dir=/bigdata/logs/upload/templog/
    
    
    #日志文件上传到hdfs的根路径
    date1=`date -d last-day +%Y_%m_%d`
    hdfs_root_dir=/data/log/$date1/
    
    #打印环境变量信息
    echo "envs: hadoop_home: $HADOOP_HOME"
    
    
    #读取日志文件的目录,判断是否有需要上传的文件
    echo "log_src_dir:"$log_src_dir
    ls $log_src_dir | while read fileName
    do
        if [[ "$fileName" == *.log ]]; then
            date=`date +%Y_%m_%d_%H_%M_%S`
            #打印信息
            echo "moving $log_src_dir$fileName to $log_toupload_dir"temp_$fileName"$date"
            mv $log_src_dir$fileName $log_toupload_dir"temp_$fileName"$date
            #将待上传的文件path写入一个列表文件will
            echo $log_toupload_dir"temp_$fileName"$date >> $log_toupload_dir"will."$date
        fi
    
    done
    #找到列表文件will
    ls $log_toupload_dir | grep will |grep -v "_DOING_" | grep -v "_DONE_" | while read line
    do
        #打印信息
        echo "toupload is in file:"$line
        #将待上传文件列表will改名为will_DOING_
        mv $log_toupload_dir$line $log_toupload_dir$line"_DOING_"
        #读列表文件will_DOING_的内容(一个一个的待上传文件名)  ,此处的line 就是列表中的一个待上传文件的path
        cat $log_toupload_dir$line"_DOING_" |while read line
        do
            #打印信息
            echo "puting...$line to hdfs path.....$hdfs_root_dir"
            hadoop fs -mkdir -p $hdfs_root_dir
            hadoop fs -put $line $hdfs_root_dir
        done    
        mv $log_toupload_dir$line"_DOING_"  $log_toupload_dir$line"_DONE_"
    done
    
    1. 执行脚本,查看结果
      sh uploadFileToHdfs.sh
     
     

    shell脚本添加新用户、删除用户

     

    使用shell脚本添加新用户,设置密码,和删除用户

    #!/bin/bash
    read -p "是否要添加用户? 是(0)否(1)" USERADD  
    if [ $USERADD -eq 0 ];then
      C=1
      while [ $C -eq 1 ];do
          read -p "请输入添加账户账户名:" UNAME  #添加用户名#
          id $UNAME &> /dev/null    #查看用户是否存在#
          if [ $? -eq 0 ];then
            echo "账户已存在! "
          else 
            read -p "请输入添加账户密码:" PASSWD     #添加密码#
            useradd $UNAME &> /dev/null      #创建用户#
            echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null    #创建用户密码#
            if [ $? -eq 0 ];then 
              echo " $UNAME 创建成功! "
            else
              echo " $UNAME 创建失败! "
            fi
          fi
          read -p "您是否还继续添加?是(1)否(0)" C   #设定变量“C”以实现删除代码循环执行#
      done
    else
      DEL=1
      while [ $DEL -eq 1 ];do
          read -p "请输入要删除的用户名:" UNAME   #要删除的用户名#
          id $UNAME &> /dev/null
          if [ $? -eq 0 ];then  #删除用户查询是否存在#
            userdel -r $UNAME     #删除用户#
            echo " $UNAME 删除成功! "
          else
            echo "未找到用户$UNAME!"
          fi
          read -p "您是否继续?是(1)否(0)" DEL   #设定变量“DEL”以实现删除代码循环执行#
      done
    fi

    Centos7 Mysql 的安装和卸载

     

    安装部分

    使用root用户,进入到/bigdata/soft目录,下载的文件会到这个目录,并安装wget工具

    cd /bigdata/soft
    yum -y install wget
    

    使用wget命令下载MySQL的rpm包

    wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
    

    安装MySQL

    yum -y install mysql57-community-release-el7-10.noarch.rpm
    

    安装MySQL Server

    yum -y install mysql-community-server
    



    通过DBeaverEE 连接测试成功!

    删除部分

    上面我们在CentOS 7当中已经安装好了5.7版本的mysql服务;
    如果以后我们不需要mysql了,或者mysql安装失败了需要重新安装,那么我们需要将mysql卸载掉
    使用root用户,执行下边命令

    ##停止mysql服务
    systemctl stop mysqld.service
    
    ##列出要删除的mysql相关的包
    yum list installed mysql*
    
    ## 卸载rpm包,使用yum remove卸载,后边依次加入上图的包名,包名之间有空格
    yum remove mysql57-community-release-el7-10.noarch \
    mysql-community-common-5.7.28-1.el7.x86_64 \
    mysql-community-client-5.7.28-1.el7.x86_64 \
    mysql-community-libs-compat-5.7.28-1.el7.x86_64 \
    mysql-community-libs-5.7.28-1.el7.x86_64 \
    mysql-community-server-5.7.28-1.el7.x86_64
    
    ##查看是否卸载干净
    yum list installed mysql*
    
    ##查找mysql剩余文件
    find / -name mysql
    
    ##删除查找到的文件
    rm -rf /var/lib/mysql/
    rm -rf /usr/share/mysql/
    rm -rf /etc/selinux/targeted/active/modules/100/mysql
    
    ##删除日志文件
    rm -rf /root/.mysql_history
    rm -f /var/log/mysqld.log
    
     

    Shell 基本语法

     

    变量命名

    定义变量时,变量名不加美元符号($)
    注意,变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:

    • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
    • 中间不能有空格,可以使用下划线(_)。
    • 不能使用标点符号。
    • 不能使用bash里的关键字(可用help命令查看保留关键字)。

    使用变量

    使用一个定义过的变量,只要在变量名前面加美元符号即可

    a=10
    echo "a=$a"
    

    返回结果:

    a=10
    

    只读变量

    使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变

    #!/bin/bash
    myUrl="https://cnblogs.com/tenic"
    readonly myUrl
    myUrl="https://www.google.com"
    

    返回结果

    myUrl: readonly variable
    

    删除变量

    使用unset命令可以删除变量,删除后不能再次使用

    unset myUrl
    

    shell 字符串

    字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。

    • 单引号
    str='this is a string'
    echo $str
    

    返回结果:

    this is a string
    

    单引号字符串的限制:

    1. 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    2. 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
    • 双引号
    your_name='tenic'
    str="Hello, I know you are \"$your_name\"! \n"
    echo -e $str
    

    输出结果为:

    Hello, I know you are "tenic"! 
    

    双引号的优点:

    1. 双引号里可以有变量
    2. 双引号里可以出现转义字符
    • 拼接字符串
    your_name="tenic"
    # 使用双引号拼接
    greeting="hello, "$your_name" !"
    greeting_1="hello, ${your_name} !"
    echo $greeting  $greeting_1
    # 使用单引号拼接
    greeting_2='hello, '$your_name' !'
    greeting_3='hello, ${your_name} !'
    echo $greeting_2  $greeting_3
    

    输出结果为:

    hello, tenic ! hello, tenic !
    hello, tenic ! hello, ${your_name} !
    
    • 获取字符串长度
    string="abcd"
    echo ${#string} #输出 4
    
    • 提取子字符串
      以下实例从字符串第 2 个字符开始截取 4 个字符:
    string="cnblogs is a great site"
    echo ${string:1:4} # 输出 nblo
    

    注意:第一个字符的索引值为 0。

    • 查找子字符串
      查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
    string="cnblogs is a great site"
    echo `expr index "$string" io`  # 输出 4
    

    注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。

    Shell 注释

    • 单行注释
      以 # 开头的行就是注释,会被解释器忽略。
      通过每一行加一个 # 号设置多行注释,

    • 多行注释
      当需要注释多行代码时,可以使用:<<EOF... EOF格式
      EOF可以使用其他符号,比如!或者'

    :<<!
    注释内容。。。
    注释内容。。。
    注释内容。。。
    !
    

    传输参数

    我们在执行shell脚本的时候,可以向shell脚本中传递参数,在shell脚本中使用这些传入的参数
    在脚本中使用 $N,N代表数字,1,2,3

    echo "接收的第一个参数是:$1"
    echo "接收的第二个参数是:$2"
    

    使用特殊字符来处理参数接收

    echo '测试$*'
    for i in "$*";do
      echo i;
    done
    
    echo '测试$@'
    for i in "$@";do
      echo i
    done
    

    返回结果

    ./demo1.sh a b c
    测试$*
    a b c
    测试$@
    a
    b
    c
    

    $* 与 $@ 区别:
    相同点:都是引用所有参数。
    不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

    默认是只有9个参数,那如果我们要取第10个参数要怎么取呢?
    echo "第10个参数${10}"

    算术运算符

    shell和其他编程一样,支持包括:算术,关系,布尔,字符串等运算符。
    原生bash不支持简单的数学运算,单是可以通过其他命令来实现,例如expr
    expr是一款表达式计算工具,使用它能完成表达式求值操作。
    使用expr表达式时要注意:
    操作数和运算符之间要有空格,eg:2 + 2,而不能写成2+2
    完整的表达是要被`包含
    下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20

    布尔运算符

    下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20

    逻辑运算符

    以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20

    字符串运算符

    下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg"

    程序流程

    1.条件分支结构
    1.1 if条件分支
    常用的判定条件运算符:
    只支持数字,不支持字符串,除非字符串的值是数字

    #! /bin/bash
    a=20
    b=10
    #if模式
    if [ $a -gt $b ];then
      echo "a大于b"
    fi
    #双分支模式
    scores=66
    if [ $scores -gt 60 ];then
      echo "成绩合格"
    else
      echo "成绩不合格"
    fi
    #多分支结构
    scores02=95
    if [ $scores02 -gt 90 ];then
      echo "成绩优秀"
    elif [ $scores02 -gt 80 ];then
      echo "成绩良好"
    elif [ $scores02 -gt 70 ];then
      echo "成绩中等"
    elif [ $scores02 -gt 60 ];then
      echo "成绩及格"
    else
      echo "成绩不及格"
    fi
    

    1.2 case条件分支

    用case语句匹配一个值于一个模式,如果匹配成功,执行匹配的命令
    取值后面必须位单词 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;(类似java中的break)。
    取值将检测匹配每一个模式,一旦匹配,则执行完匹配模式相应命令后,不在继续其他模式。如果无一匹配模式,使用* (类似java中的default)捕获该值,在执行后面的命令。

    #!/bin/bash
    a=20
    case $a in
      10) echo "a的值是10"
      ;;
      20)echo "a的值是20"
      ;;
      *) echo "a的值不是10也不是20"
      ;;
    esac
    

    循环结构

    1.for循环
    使用循环遍历1-5

    #! /bin/bash
    echo "第一种方式"
    for i in 1 2 3 4 5; do
      echo $i
    done
    
    echo "第二种方式"
    for i in (1..5); do
      echo $i
    done
    
    echo "使用循环遍历1-5中的奇数,1-5,步长是2"
    for i in (1..5..2);do
      echo $i
    done
    
    echo "使用遍历访问目录下的内容"
    for i in 'ls /';do
      echo $i
    done
    

    2.while循环
    计算1加到10的值

    #!/bin/bash
    sum=0
    i=1
    while [ $i -ge 10 ];do
      sum=$[sum + i]
      i=$[i + 1]
    done
    
    echo $sum
    

    每个1秒打印一次系统时间

    
    #!/bin/bash
    while true;do
      date
      sleep 1
    done
    

    break和continue
    break是结束所有循环

    #!/bin/bash
    i=1
    while true; do
      if [ $i -gt 10 ];then
        break;
      fi
      echo $i
      date
      sleep1
      i=$[i + 1]
    done
    

    continue是结束本次,进入下次循环

    #!/bin/bash
    for i in (1..20);do
      if test $[ i % 3] -eq 0;then
        continue
      fi
      echo $i
    done
    

    3 util 循环
    until 循环执行一系列命令直至条件为 true 时停止。
    until 循环与 while 循环在处理方式上刚好相反。
    一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

    until condition
    do
        command
    done
    condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环
    

    函数

    #!/bin/bash
    print(){
    	echo "this is my first function"
    }
    
    echo "调用函数print开始"
    print
    echo "调用函数print结束"
    
    • 函数传参
      调用函数时可以向其传递参数,在函数体内部,通过$n的形式来获取参数的值,注意:$10不能获取到第10个参数,要使用${10}来获取
    #!/bin/bash
    print(){
    	echo "第一个参数是:$1"
    	echo "第10个参数是:${10}"
    }
    print 1 2 3 4 5 6 7 8 9 10 11
    
    • 返回值
    add(){
    	return $[ $1 + $2 ]
    }
    add 1 2
    echo $?   # $?可以获取最后命令执行的结果作为返回值使用
    

    数组

    特点
    bash中的数组只支持一维数组
    初始化时不需要定义数组大小
    数组元素的下标由0开始
    用括号表示,元素用空格符号分隔开

    • 读取数组
    #!/bin/bash
    arr01=(1 3 "a" "abc")
    echo "数组第一个元素${arr01[0]}"
    echo "数组最后一个元素${arr01[10]}"
    echo "读取数组全部数据${arr01[*]}"
    echo "读取数组的长度:${#arr01[*]}"
    
    arr01[3]="dff"
    echo "修改后的数组全部数据为${arr01[*]}"
    
    • 遍历数组
    for i in ${arr01[*]};do
     echo $i
    done
    
    SHELL 复制 全屏

    函数引用

    使用source 来加载另外一个shell脚本
    或者使用 .来加载

    #! /bin/bash
    source ./demo11.sh
    
    for i in ${arr01[*]};do
      echo $i
    done
  • 相关阅读:
    Java中的File类
    scala语法
    Spark核心原理
    资源调度器
    YARN工作机制
    MapReduce原理和工作过程
    序列化
    Hbase(2)表的设计和Rowkey等的设计
    Hbase(1)架构和工作原理
    Exception in thread "main" java.lang.NoSuchMethodError: io.netty.buffer.PooledByteBufAllocator.metric()Lio/netty/buffer/PooledByteBufAllocatorMetric;
  • 原文地址:https://www.cnblogs.com/hanease/p/16219157.html
Copyright © 2020-2023  润新知