linux运维—脚本基础

一.Bash脚本简介
1.基础简介
    BASH = GNU Bourne-Again Shell,BASH 是 GNU 组织开发和推广的一个项目。Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、条件、判断等重要功能,语法简 单实用,用以编写程序,大大简化管理员的操作,并可以完成图形工具所无法实现的功能。

2.
如何创建新shell脚本?
    1.创建包含bash命令的文本文件。文件的第一行应为
:
    #!/bin/bash
    2. 使文件可执行(使用
chmod +x scripts)
    3. 将文件放置在用户的$PATH的目录中

    ~/bin – 用于用户的私有程序
    /usr/local/bin – 本地开发、系统上的其他人使用的脚本
    /usr/local/sbin - 本地开发、由root使用的脚本
    直接运行脚本和使用source命令运行脚本是不同的!
    脚本调试模式
:
    #!/bin/bash -x
    # bash -x scripts

3.引用和转义

    引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。
    引用有三种类型:

    a.弱引用

    将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外。换言之,变量扩展和命令扩展在双引号内仍起作用。
    echo “can I have a $FRUIT”
    echo “The current time is $(date+%r).”  
    b.
强引用
    将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展:
    echo “Make $$$ Fast”
    rm 'untitled folder'
    c.转义

    非引用的\是转义字符。它保留了下一个字符的文字值。(例如,\$PATH是确切的字符串$PATH,而不是PATH变量的内容。)
    echo Make \$\$\$ Fast\!
    ls untitled\ folder

4.Shell变量

    shell变量用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变量的脚本。
    若要定义或指定值:
    FRUIT=apple
    若要参考或使用变量
:
    $FRUIT
    ${FRUIT}
    [root@server22 ~]# FIRST=John
    [root@server22 ~]# LAST=Doe
    [root@server22 ~]# echo $FIRST$LAST
    John Doe
    [root@server22 ~]# echo$FIRST_$LAST
    Doe
    [root@server22 ~]# echo${FIRST}_$LAST
    John_Doe

5.算术运算符

    算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。
    operator meaning
    ++
增量后
    -- 减量后
    - 减法
    + 加法
    ** 幂运算
    * 乘法
    / 除法
    % 余数
    += 加等
    -= 减等

6.Shell
计算命令:
    用$[]表示数学运算。

    # echo $[1+2]
    # a=1; echo $[$[$a+1]*2]
   
用expr表示数学运算。
    # echo `expr 1 + 2`
   
用let指示数学运算。
    # let A=1+2
    # echo $A
   
用(())表示数学运算。bash内建功能,效率高。
    #!/bin/bash
    for ((i=1;i<10;i++))
    do
    ((j+=i))
    done
    echo $j

7.
特殊参数介绍:
    bash对一些参数的处理比较特殊,这些参数只能被引用,但不能修改他们的值
    特殊参数*:将扩展为从1开始的所有位置参数
eg
    set one two three
    echo “$*”
    one two three

   
特殊参数@:也将扩展为从1开始的所有位置参数(与参数*的区别将在for循环调用中显现出来。

   
特殊参数#:将扩展为位置参数的个数
eg:
    set one two three
    echo $#
    3

   
特殊参数?:将拓展为一个最近在前台执行的命令的退出状态。
eg
    touch file
    echo $?
    0

   
特殊参数-:将扩展为当前的选项标志

   
特殊参数$:将扩展为当前shell的进程号

   
特殊参数0:将扩展为shell或shell脚本的名字

8.Bash
位置参数
    有两种简单的方法可以将用户输入读入bash中的变量。第一个方法是使用read提示用户输入(使用-p选项)并将其直接存储到一个或多个变量:交互式输入
    # read -p 'Enter your first and lastname: ' FIRST LAST
   
另一个方法是使用位置参数来读取传递给脚本的命令行参数或选项输入。各种特殊变量存储传递的选项编号Bash解析的个别参数或整个原始命令行。
    指定的位置参数总数:$#
    位置参数自身:$0、$1、$2、
$3....
    所有位置参数: $@、
$*

9.退出状态

    Linux命令完成时,将返回退出状态。成功完成程序时,将返回0的推出状态。这被bash当作逻辑True值。非零退出状态通常表示发生了错误,并且被bash当作逻辑False值。
    例如:grep的退出状态的含义:
    0 – 在指定的文件中找到了模式

    1 – 在指定的文件中未找到模式
    >1 – 一些其他错误(无法打开文件、错误的搜索表达式等)
    推出状态的值被存储在"?"中,可以使用以下命令查看
:
    # echo $?

test条件判断:

    est命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式为true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语
法,使用方括号"[]"将表达式括起来,这样更易于阅读。
    语法:testEXPRESSION 或 [EXPRESSION]
    非零或零长度字符串运算符
:test-{n|z} STRING

    操作符:

    -e   如果存在则为真
    -f   如果存在且是一个常规文件则为真
    -d   如果存在且是一个目录则为真
    -c   如果存在且是一个特殊字符文件则为真
    -b   如果存在且是一个特殊块文件则为真
    -p   如果存在且是一个命名管道则为真
    -S   如果存在且是一个套接字文件则为真
    -L   如果存在且是一个符号链接则为真
    -h   如果存在且是一个符号链接则为真
    -g   如果存在且时设置了sgid位则为真
    -u   如果存在且时设置了suid位则为真
    -r   如果存在且可读则为真
    -w   如果存在且可写则为真
    -x   如果存在且时可执行则为真
    -s   如果存在且不为空则为真

    -z  
如果为空则为真
    -n   如果不为空则为真
    =  如果两者相同则为真
    !=  如果两者不相同则为真
   
   
算术操作符:
    -eq 相等则为真
    -ne 不想等则为真
    -le 小于或等于则为真
    -ge 大于或等于则为真
    -lt 小于则为真
    -gt 大于则为真
   
10.if
语句
    if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之间的命令列表(反向平写if,标记if块的结束)。
    语法:if command;then command; command2; else command3; fi
    eg:

        if test “$1” =="123"
        then
        echo -e "\nRight"
        exit 0
        fi 
        exit 1 

11.case
语句
    case语句 :它能够把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪部分代码。
    case "$1" in
    start)
    systemctl start $2
    ;;
    stop)
    systemctl stop $2
    ;;
    reload|restart)
    systemctl stop $2
    systemctl start $2
    ;;
    *)
    echo "Usage: $0(start|stop|restart|reload)"
    ;;
    esac   
   
12.expect
语句
    在shell中利用expect实现自动应答脚本。
    #!/usr/bin/expect
   
这一行告诉操作系统脚本里的代码使用那一个shell来执行。
    set timeout 10
   
设置后面所有的expect命令的等待响应的超时时间,单位为秒。
    spawn talk
    spawn
是expect的内部命令,作用是给后面的shell指令加个壳,用来传递交互指令。
    expect "who"
   
判断上次输出结果里是否包含“who”的字符串,如果有则立即返回,否则等待超时时间后返回。
    send "westos\n"
   
执行交互动作,相当于手工输入"westos"。
    expect eof
   
作用是在输出中搜索文件结束符,如果没有这一行,脚本会立即退出,得不到正确结果。
    interact
   
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。否则退出登录。
    $argv 参数数组
    expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数。
 

你可能感兴趣的:(linux运维—脚本基础)