美文网首页Linux
shell 脚本(Linux--ubuntu)

shell 脚本(Linux--ubuntu)

作者: husky_1 | 来源:发表于2018-10-29 23:29 被阅读0次

    介绍

    1. Shell介绍

    (1)shell是一种命令语言,也是一个用 C 语言编写的程序 (命令解释器->“翻译官”)
    (2)作用:主要提供一个接口使用户与内核交互操作。
    (3)流程:接收用户输入的命令并且进行解析,然后将命令送入内核去执行 -> 最后将结果返回给用户。

    2.Shell常见类型

    名称 来源 比较
    sh (Bourne Shell) AT&T Bell实验室的Steve Bourne开发 最早
    csh (C Shell) 加州伯克利大学的Bill Joy 更强
    ksh (Korn Shell) AT&T Bell实验室的David Korn开发 升级
    bash(Bourne Again Shell) 自由软件基金会(GNU)开发的一个Shell 统一
    • 查看shell指令
    1. 查看当前系统支持的shell类型:
    cat /etc/shells
    
    1. 查看当前使用的shell类型:
     echo $SHELL
    

    3.Bash介绍

    3.1 bash功能(内部命令和外部命令)

    3.2 bash 语法

    • 脚本文件创建及运行

    (a)穿件bash文件:

    vi 文件名.sh    或者    vi 文件名 
    

    (b) 在文件名头部申明

    #!/bin/bash
    代码段
    

    (c)运行:

    chmod a+x 路径及文件名.sh   // 修改文件权限---可执行
    方法1: sh  路径及文件名.sh(推荐)
    方法2: /bin/bash 路径及文件名.sh   (文件中可省去申明,但是必须在/bin/bash 路径下)
    方法3:  source 路径及文件名.sh
    方法4: . 路径及文件名.sh
    

    示例: 创建test.sh脚本并输出hello world


    • 文件或者目录权限修改
    名称 语法
    更改拥有者(change own) chown -R 拥有者待更改的文件
    更改所属组(change group chgrp -R 所属组待更改的文件
    更改权限(change mode) chmod -R ABC<用数字表示> 待更改的文件
    更改权限(change mode) chmod -R <augo><+-=><rwx>,...,待更改的文件

    ABC分别代表(拥有者、所属组、其他组)
    augo分别代表(所有用户,拥有者、所属组用户、其他组用户)

    权限范围:+ 追加、- 移除、= 修改
    数字表示(1-执行,2-可写,3-可写可执行,4-可读,5-可读可执行,6-可读可写,7可读可写可执行)


    • 目录或文件授权rwx作用
    代表字母 权限 文件含义 目录含义
    r 读权限 查看文件内容 列出目录内容 (ls 指令)
    w 写权限 修改文件 目录中创建删除文件
    x 执行权限 可以执行文件 可以进入目录(cd指令)

    4.shell 变量

    4.1 本地变量

    • 概念:

    只对当前shell进程有效(ps. 对当前进程的子进程和其它shell进程无效)

    • 语法:
    设置:变量名=变量值(等号不能有空格)
    删除:unset 变量名
    输出:echo $变量名
    
    • 示例代码:
    like@ubuntu:~$ test=1    --创建变量
    like@ubuntu:~$ echo $test    --打印变量
    1
    like@ubuntu:~$ unset test      -- 删除变量
    like@ubuntu:~$ echo $test    
    
    like@ubuntu:~$ 
    

    4.2 环境变量

    • 概念:

    环境变量名词,效果执行一个命令会去“环境变量”设置的目录中挨个找该命令的可执行程序(1-找到了直接执行,2-找不到则报错)

    • 语法:
    export 变量名=变量值 
    

    注:
    1.当环境变量在/etc/profile 中申明后, 对所有用户都有效.
    2.在家目录中的.bashrc 中申明后, 对当前用户都有效
    3.需要执行source /etc/profile 或者重启shell 窗口才能生效

    4.3 局部变量

    • 概念:

    函数中申明的变量,函数调用时创建、调用完毕时销毁

    • 语法:
    local 变量名=变量值
    
    • 示例代码:
    like@ubuntu:~$ function ab(){
    > local a=10
    > echo $a
    > }
    like@ubuntu:~$ ab
    10
    like@ubuntu:~$ echo $a.  --函数调用完毕后, 变量释放
    
    like@ubuntu:~$ 
    

    4.4 位置变量

    • 概念:

    指程序运行时动态传入参数

    • 语法:
    sh 路径及文件名 参数1 ... 参数n
    echo $1  /  ..   /  echo $n
    
    • 示例代码:
    like@ubuntu:~$ vim test1.sh
    like@ubuntu:~$ cat test1.sh 
    #!/bin/bash
    
    echo $1
    echo $2
    like@ubuntu:~$ sh test1.sh 10 20  --- 将10 ,20 传值给第一个参数和第二个参数
    10
    20
    

    4.5 特殊变量

    • 概念:

    系统定义的特殊含义的变量(预定义变量)

    变量 含义
    $0 当前脚本的文件名
    $n 传递给脚本或函数的参数。n 表示第几个参数。例如,第一个参数是$1
    $# 传递给脚本或函数的参数个数。
    $* 传递给脚本或函数的所有参数。
    $@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
    $? 上个命令的退出状态,或函数的返回值。
    $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

    4.6 文件通配符

    符号 含义
    * 匹配0个或多个任意字符
    ? 匹配一个任意字符
    [若干字符] 匹配中括号中的一个字符

    示例:

    匹配5结尾的.doc文件 (ls 5.doc)
    匹配a开头的.doc文件 (ls a
    .doc)
    匹配第二个字符是a或1的.doc文件 (ls ?[1a]*.doc)

    4.7 命令代换

    • 概念:

    通过语法反引号或$(名称)实现先解析shell指令,再赋值给变量

    • 示例代码:
    like@ubuntu:~$ date
    2018年 10月 29日 星期一 20:47:26 CST
    like@ubuntu:~$  a1=$(date)
    like@ubuntu:~$ echo $a1
    2018年 10月 29日 星期一 20:47:53 CST
    like@ubuntu:~$ a2=`date`
    like@ubuntu:~$ echo $a2
    2018年 10月 29日 星期一 20:48:14 CST
    

    4.9 算数代换

    • 概念:

    通过(()) 或[]实现运算功能。

    注: 在脚本文件中只能使用$(())

    • 示例代码:
    like@ubuntu:~$ echo 1+1
    1+1
    like@ubuntu:~$ echo $((1+1))
    2
    like@ubuntu:~$ echo $[ 1+1 ]
    2
    like@ubuntu:~$ a1=2
    like@ubuntu:~$ echo $(($a1+1))
    3
    like@ubuntu:~$ echo $[ ${a1}+1 ]
    3
    

    5.shell 流程控制(判断)

    5.1 条件测试

    • 概念:

    通过test或 [] 可以测试一个条件是否成立

    • 语法:
    --方法一
    test 值1 条件 值2
    --方法二
    [值1 条件 值2]
    
    脚下留心:0-代表结果成立,1-代表结果不成立
    
    • 示例代码: 5>3 ? 5>7 ?
    like@ubuntu:~$ [ 5 -gt 3 ]
    like@ubuntu:~$ echo $?
    0
    like@ubuntu:~$ [ 5 -gt 7 ]
    like@ubuntu:~$ echo $?
    1
    

    5.2 if else 语句

    • 语法:
    if 条件1
    then
        命令1
    elif 条件2
    then 
        命令2
    else
        命令
    fi
    
    • 示例代码1:

    判断成绩(>=90优秀,>=80良好,>=60及格,>=0不及格)

    like@ubuntu:~$ vim test3.sh
    like@ubuntu:~$ cat test3.sh 
    #!/bin/bash
    SCORE=$1
    
    if [ $SCORE -ge 90 ]
    then
        echo '优秀'
    elif [ $SCORE -ge 80 ]
    then
        echo '良好'
    elif [ $SCORE -ge 70 ]
    then
        echo '一般'
    elif [ $SCORE -ge 60 ]
    then
        echo '及格'
    elif [ $SCORE -ge 0 ]
    then
        echo '不及格'
    else
        echo '有瑕疵'
    fi
    like@ubuntu:~$ sh test3.sh 99
    优秀
    
    • 示例代码2:

    判断当前执行脚本是否是root用户

    vim who.sh 
    like@ubuntu:~$ cat who.sh 
    #!/bin/bash
    
    who=$(whoami)
    if [ $who!='root' ]
    then
        echo 'wrong'
        echo $who
    else
        echo 'right'
    fi
    like@ubuntu:~$ sh who.sh 
    wrong
    like
    

    5.3 case语句

    • 语法:
    case $变量名 in
      "值1")
        如果变量的值等于值1,则执行程序1
        ;;
      "值2")
        如果变量的值等于值2,则执行程序2
        ;;
      ....
      *)
        如果以上都不成立,则执行此程序
        ;;
    esac
    
    • 示例代码:

    需求:执行脚本让用户输入
    yes - installing...
    no - skip
    其他 - Please enter the correct option

    like@ubuntu:~$ vim case.sh
    like@ubuntu:~$ cat case.sh 
    #!/bin/bash
    
    read -p "Please Input yes/no: " Select_Id
    case $Select_Id in
      "yes")
        echo 'installing...'
        ;;
      "no")
        echo 'skip'
        ;;
      *)
        echo 'Please enter the correct option'
        ;;
    esac
    like@ubuntu:~$ sh case.sh 
    Please Input yes/no: yes
    installing...
    like@ubuntu:~$ sh case.sh 
    Please Input yes/no: no
    skip
    

    6.shell 循环

    6.1 for 循环

    • 语法:
    for 变量名 in 值1 ... 值N
    do
        命令
    done
    
    • 示例代码1:

    输出6个数

    like@ubuntu:~$ vim for.sh 
    like@ubuntu:~$ cat for.sh 
    #!/bin/bash
    
    for i in 1 2 3 4 5 6
    do
      echo $I
    done
    like@ubuntu:~$ sh for.sh 
    1
    2
    3
    4
    5
    6
    
    • 示例代码2:

    输出指定目录下得所有文件名

    like@ubuntu:~$ vim for1.sh 
    like@ubuntu:~$ cat for1.sh 
    #!/bin/bash
    
    cd $1
    filenames=$(ls)
    
    for name in $filenames
    do
       echo $name
    done
    
    like@ubuntu:~$ sh for1.sh  /home
    like
    

    6.2 while 循环

    • 语法:
    while 条件
    do
        命令
    done
    
    • 示例代码1:

    输出1-10

    like@ubuntu:~$ vim while.sh
    like@ubuntu:~$ cat while.sh 
    #!/bin/bash
    
    I=1
    while [ $i -le 10 ]
    do
        echo $I
        i=$(($i+1))
    done
    
    like@ubuntu:~$ sh while.sh 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    

    7. 计划任务

    7.1 介绍

    概 念:约定时间执行指定任务(或执行指定脚本文件)
    举例1:通过计划任务定时发布文章
    举例2:通过计划任务凌晨3点将测试服务器项目代码同步到线上服务器

    7.2 使用

    步骤1:通过命令【crontab -e】编写计划任务
    步骤2:按【i】键编写,最后按【esc】【:wq】保存并退出

     -- crontab 指令介绍 
    usage:  crontab [-u user] file
        crontab [ -u user ] [ -i ] { -e | -l | -r }
            (default operation is replace, per 1003.2)
        -e  (edit user's crontab)  ---编写计划
        -l  (list user's crontab)   --- 查看计划
        -r  (delete user's crontab)   --- 删除计划
        -i  (prompt before deleting user's crontab) --- 删除计划前提示
    

    7.3 语法

    *     *     *     *     *     任务

    项目 含义 范围
    第一个* 分钟 0~59
    第二个* 小时 0~23
    第三个个* 天数 1~31
    第四个* 月份 1~12
    第五个* 星期 0~7(0&7代表星期天)
    项目 含义 例子
    代表不连续时间 0 8,12,16 * * * 每天8,12,16点执行
    - 代表连续时间 0 5 * * 1-6 每周一到六 5点执行
    * /n 代表间隔多久执行 */10 * * * *每隔10min执行
    • 示例代码:
    // 创建计划任务
    like@ubuntu:~$ crontab -u like -e
    no crontab for like - using an empty one
    crontab: installing new crontab
    
    // 查看计划任务
    like@ubuntu:~$ crontab -l
    # Edit this file to introduce tasks to be run by cron.
    # 
    # Each task to run has to be defined through a single line
    # indicating with different fields when the task will be run
    # and what command to run for the task
    # 
    # To define the time you can provide concrete values for
    # minute (m), hour (h), day of month (dom), month (mon),
    # and day of week (dow) or use '*' in these fields (for 'any').# 
    # Notice that tasks will be started based on the cron's system
    # daemon's notion of time and timezones.
    # 
    # Output of the crontab jobs (including errors) is sent through
    # email to the user the crontab file belongs to (unless redirected).
    # 
    # For example, you can run a backup of all your user accounts
    # at 5 a.m every week with:
    # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
    # 
    # For more information see the manual pages of crontab(5) and cron(8)
    # 
    # m h  dom mon dow   command
    */1 * * * * echo 9 >> /home/like/test.txt   ---- 每分钟给test.txt 追加9
    
    
    like@ubuntu:~$ crontab -r       -- 删除计划
    like@ubuntu:~$ crontab -l
    no crontab for like                      -- 删除成功
    
    • 示例2:
    时间 含义
    45 22 * * * 命令 在22点45分执行
    0 17 * * 1 命令 每周一17点执行
    0 5 1,15 * * 命令 每月1和15号5点执行
    40 4 * * 1-5 命令 每周1~5 4点40 执行
    */10 4 * * * 命令 每天4点每隔10min执行
    0 0 1,15 * 1 命令 每月1和15 号 每周一的0点执行

    相关文章

      网友评论

        本文标题:shell 脚本(Linux--ubuntu)

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