zoukankan      html  css  js  c++  java
  • (一)shell编程

    编程逻辑处理方式

    顺序执行:程序按从上到下顺序执行
    选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
    循环执行:程序执行过程中需要重复执行多次某段语句
    

    shell 脚本基本结构

    shell脚本编程:是基于过程式、解释执行的语言

    编程语言的基本结构:

    各种系统命令的组合

    数据存储:变量、数组

    表达式:a + b

    控制语句:if

    shell脚本:包含一些命令或声明,并符合一定格式的文本文件

    格式要求:首行shebang机制

    #!/bin/bash
    #!/usr/bin/python
    #!/usr/bin/perl
    

    shell脚本创建过程

    第一步:使用文本编辑器来创建文本文件

    第一行必须包括shell声明序列:#!

    示例:

    #!/bin/bash
    

    添加注释,注释以#开头

    第二步:加执行权限

    给予执行权限,在命令行上指定脚本的绝对或相对路径

    第三步:运行脚本

    直接运行解释器,将脚本作为解释器程序的参数运行

    shell 脚本注释规范

    1、第一行一般为调用使用的语言
    2、程序名,避免更改文件名为无法找到正确的文件
    3、版本号
    4、更改后的时间
    5、作者相关信息
    6、该程序的作用,及注意事项
    7、最后是各版本的更新简要说明
    

    第一个 shell 脚本

    #!SHEBANG
    CONFIGURATION_VARIABLES
    FUNCTION_DEFINITIONS
    MAIN_CODE
    
    #执行方法1
    [root@centos8 ~]# bash /data/hello.sh
    #执行方法2
    [root@centos8 ~]# cat /data/hello.sh | bash
    #执行方法3
    [root@centos8 ~]# bash < /data/hello.sh
    #执行方法4
    [root@centos8 ~]# chmod +x /data/hello.sh
    #绝对路径
    [root@centos8 ~]#/data/hello.sh
    #相法路径
    [root@centos8 ~]# cd /data/
    [root@centos8 ~]#./hello.sh
    #执行方法5,本方法可以实现执行远程主机的shell脚本
    [root@centos8 ~]# yum -y install httpd
    [root@centos8 ~]# systemctl start httpd
    [root@centos8 ~]# mv /data/hello.sh /var/www/html/
    [root@centos8 ~]# curl http://10.0.0.8/hello.sh
    

    范例:执行远程主机的脚本

    [root@centos8 ~]# curl http://10.0.0.8/hello.sh 2>/dev/null |bash
    hello, world
    Hello, world!
    [root@centos8 ~]# curl http://10.0.0.8/hello.sh >/dev/null |bash
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 388 100 388 0 0 378k 0 --:--:-- --:--:-- --:--:-- 378k
    [root@centos8 ~]# wget -qO - http://www.wangxiaochun.com/testdir/hello.sh | bash
    hello, world
    Hello, world!
    

    备份脚本

    #!/bin/bash
    # 
    #********************************************************************
    #Author:        xuanlv
    #QQ:            xxxxxxxxxx
    #Date:          2021-04-18
    #FileName:     backup.sh
    #URL:           https://www.cnblogs.com/xuanlv-0413/
    #Description:      The test script
    #Copyright (C):     2021 All rights reserved
    #********************************************************************
    echo -e "33[1;32mStarting backup...33[0m"
    sleep 2
    cp -av /etc/ /data/etc`date +%F`/
    echo -e "33[1;32mBackup is finished33[0m"
    

    shell 脚本调试

    只检测脚本中的语法错误,但无法检查出命令错误,但不真正执行脚本

    bash -n /path/to/some_script
    

    调试并执行

    bash -x /path/to/some_script
    

    范例:

    root@long:~# cat -A test.sh 
    #!/bin/bash$
    #$
    #********************************************************************$
    #Author:^I^Ixuanlv$
    #QQ: ^I^I^I3xxxxxx$
    #Date: ^I^I^I2021-04-18$
    #FileNameM-oM-<M-^Z^I^Itest.sh$
    #URL: ^I^I^Ihttps://www.cnblogs.com/xuanlv-0413/$
    #DescriptionM-oM-<M-^Z^I^IThe test script$
    #Copyright (C): ^I2021 All rights reserved$
    #********************************************************************$
    echo line$
    hostname$
    cat > test.txt <<EOF $
    aaa$
    fadf$
    ccc$
    ddd$
    EOF $
    $
    echo line233$
    root@long:~# bash -n test.sh 
    test.sh: line 21: warning: here-document at line 14 delimited by end-of-file (wanted `EOF')
    

    总结:脚本错误常见的有三种

    语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
    
    命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
    
    逻辑错误:只能使用 bash -x 进行观察
    

    变量

    变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据

    变量类型

    内置变量,如:PS1,PATH,UID,HOSTNAME,$$,BASHPID,PPID,$?,HISTSIZE
    
    用户自定义变量
    不同的变量存放的数据不同,决定了以下
    数据存储方式
    参与的运算
    表示的数据范围
    变量数据类型:
    字符
    数值:整型、浮点型,bash 不支持浮点数
    

    编程语言分类

    静态和动态语言
    静态编译语言:使用变量前,先声明变量类型,之后类型不能改变,在编译时检查,如:java,c
    动态编译语言:不用事先声明,可随时改变类型,如:bash,Python
    
    强类型和弱类型语言
    强类型语言:不同类型数据操作,必须经过强制转换才同一类型才能运算,如java , c# ,
    python
    如:参考以下 python 代码
    print('magedu'+ 10) 提示出错,不会自动转换类型
    print('magedu'+str(10)) 结果为magedu10,需要显示转换类型
    弱类型语言:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会
    自动进行隐式类型转换;变量无须事先定义可直接调用
    如:bash ,php,javascript
    

    Shell中变量命名法则

    命名要求
    区分大小写
    不能使程序中的保留字和内置变量:如:if, for
    只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
    
    命名习惯
    见名知义,用英文单词命名,并体现出实际作用,不要用简写,如:ATM
    变量名大写
    局部变量小写
    函数名小写
    大驼峰StudentFirstName
    小驼峰studentFirstName
    下划线: student_name
    
    变量定义和引用
    变量的生效范围等标准划分变量类型
    普通变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
    环境变量:生效范围为当前shell进程及其子进程
    本地变量:生效范围为当前shell进程中某代码片断,通常指函数
    

    变量赋值:

    name='value'
    

    value 可以是以下多种形式

    直接字串:name='root'
    变量引用:name="$USER"
    命令引用:name=`COMMAND` 或者 name=$(COMMAND)
    

    注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除

    变量引用

    $name
    ${name}
    

    弱引用和强引用

    "$name " 弱引用,其中的变量引用会被替换为变量值
    '$name ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
    

    范例:变量的各种赋值方式和引用

    root@long:~# TITLE='cto'
    root@long:~# echo $TITLE 
    cto
    root@long:~# echo I am $TITLE 
    I am cto
    root@long:~# echo "I am $TITLE"
    I am cto
    root@long:~# echo 'I am $TITLE'
    I am $TITLE
    root@long:~# 
    root@long:~# NAME=$USER
    root@long:~# echo $NAME 
    root
    root@long:~# USER=`whoami`
    root@long:~# echo $USER 
    root
    root@long:~# FILE=`ls /home`
    root@long:~# echo $FILE 
    long
    root@long:~# 
    root@long:~# FILE=/etc/*
    root@long:~# echo $FILE 
    /etc/acpi /etc/adduser.conf /etc/alternatives /etc/apm /etc/apparmor /etc/apparmor.d /etc/apport /etc/apt /etc/at.deny /etc/bash.bashrc /etc/bash_completion /etc/bash_completion.d /etc/bindresvport.blacklist /etc/binfmt.d /etc/byobu /etc/ca-certificates
    
    root@long:~# seq 10
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    root@long:~# NUM=`seq 10`
    root@long:~# echo $NUM 
    1 2 3 4 5 6 7 8 9 1
    root@long:~# echo "$NUM"
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    root@long:~# NAMES="long
    > wang
    > zhi
    > shi"
    root@long:~# echo $NAMES
    long wang zhi shi
    root@long:~# echo "$NAMES"
    long
    wang
    zhi
    shi
    

    范例:变量引用

    root@long:~# NAME=long
    root@long:~# AGE=20
    root@long:~# echo $NAME
    long
    root@long:~# echo $AGE 
    20
    root@long:~# echo $NAME $AGE 
    long 20
    root@long:~# echo $NAME$AGE 
    long20
    root@long:~# echo $NAME_$AGE 
    20
    root@long:~# echo ${NAME}_$AGE 
    long_20
    

    范例:变量的间接赋值和引用

    root@long:~# TITLE=cto
    root@long:~# NAME=long
    root@long:~# TITLE=$NAME
    root@long:~# echo $NAME
    long
    root@long:~# echo $TITLE 
    long
    root@long:~# NAME=wang
    root@long:~# echo $NAME
    wang
    root@long:~# echo $TITLE 
    long
    

    范例:变量追加值

    root@long:~# TITLE=cto
    root@long:~# TITLE+=:long
    root@long:~# echo $TITLE 
    cto:long
    

    范例:利用变量实现动态命令

    root@BJ-long:~# CMD=hostname
    root@BJ-long:~# $CMD
    BJ-long.longUbuntu.local
    

    显示已定义的所有变量:

    set
    

    删除变量:

    unset <name>
    

    范例:

    root@BJ-long:~# vim backup2.sh 
    
    #!/bin/bash
    # 
    #********************************************************************
    #Author:        xuanlv
    #QQ:            xxxxxxx
    #Date:          2021-04-18
    #FileName:     backup2.sh
    #URL:           https://www.cnblogs.com/xuanlv-0413/
    #Description:      The test script
    #Copyright (C):     2021 All rights reserved
    #********************************************************************
    COLOR='echo -e E[1;35'
    END='E[0m'
    BACKUP=/backup
    SRC=/etc
    DATE=`data +%F`
    
    ${COLOR}Starting backup...$END
    sleep 2
    cp -av $SRC ${BACKUP}${SRC}_$DATE
    ${COLOR}Backup is finished$END 
    
  • 相关阅读:
    HDU 5791 Two (DP)
    POJ 1088 滑雪 (DPor记忆化搜索)
    LightOJ 1011
    POJ 1787 Charlie's Change (多重背包 带结果组成)
    HDU 5550 Game Rooms (ccpc2015 K)(dp)
    HDU 5542 The Battle of Chibi (ccpc 南阳 C)(DP 树状数组 离散化)
    HDU 5543 Pick The Sticks (01背包)
    HDU 5546 Ancient Go (ccpc2015南阳G)
    NB-IoT的DRX、eDRX、PSM三个模式 (转载,描述的简单易懂)
    MQTT 嵌入式端通讯协议解析(转)
  • 原文地址:https://www.cnblogs.com/xuanlv-0413/p/14881408.html
Copyright © 2011-2022 走看看