第九次笔记

    xiaoxiao2021-03-25  129

    1.

    Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操作,并可以完成图形工具所无法实现的功能。

     

    如何创建新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

     

     

    #!/bin/bash

     

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

     

    ""(双引号)弱引用

    将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\ 和 ! 字符除外。换言之,变量扩展和命令扩展在双引号内仍起作用。

    #!/bin/bash

    echo #hello world#

     

    ./hello.sh

     

    bash -x hello.sh(查看脚本的内容输入)

    + echo## + 表示执行的优先级

    加双引号后:

    [root@localhost mnt]# vim hello.sh

    [root@localhost mnt]# ./hello.sh

    #hello world#

     

    '' ##强引用              (单引将字符串放置在单引号内,保留字符串中所有字符的文字值,同时禁用所有扩展

     

    [root@localhost mnt]# vim hello.sh

    #!/bin/bash

    echo "$HOME"

    [root@localhost mnt]# ./hello.sh

    /root

    [root@localhost mnt]# bash -x hello.sh

    + echo /root

    /root

     

    [root@localhost mnt]# vim hello.sh

    #!/bin/bash

    echo  '$HOME'

    [root@localhost mnt]# ./hello.sh

    $HOME

    [root@localhost mnt]# bash -x hello.sh

    + echo '$HOME'

    $HOME

     

     

    \     转义字符 它保留了下一个字符的文字值,也叫做“逃逸字符”,目的在于使后接的字符回复原来作为单纯字符的用途。

    echo Make \$\$\$ Fast\!

    ls untitled\ folder

     

    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

     

    循环与计算结合:

    #!/bin/bash

    for ((i=1;i<=100;i++))

    do

    ((j+=i))

    #j=`expr $j + $i`

    #let j+=i

    #j=$[j+=i]

    done

    echo $j

     

    #######用户创建的脚本######

     

    1.vim /mnt/userfile

    user1

    user2

    user3

    2.vim /mnt/passwordfile

    user1westos

    user2westos

    user3westos

    3.vim /mnt/create_user.sh

    #!/bin/bash

    MAXLINE=`wc -l /mnt/userfile | cut -d " " -f 1`     

    for NUM in $(seq 1 $MAXLINE)

    do

            USERNAME=`sed -n ${NUM}p /mnt/userfile`

            PASSWORD=`sed -n ${NUM}p /mnt/passwordfile`

            useradd $USERNAME

            echo $PASSWORD | passwd --stdin $USERNAME

    done

    4.chmod +x /mnt/create_user.sh

    5../create_user.sh

    [root@dns-server mnt]# ./user_create.sh

    Changing password for user user1.

    passwd: all authentication tokens updated successfully.

    Changing password for user user2.

    passwd: all authentication tokens updated successfully.

    Changing password for user user3.

    passwd: all authentication tokens updated successfully.

     

     

    #####计时脚本########

    1.

    vim /mnt/time.sh

    #!/bin/bash

    for ((i=1;i<=10;i++))

    do

            echo -n $i

            #echo -ne '\r    \r'

            sleep 1

    done

    sh /mnt/time.sh

    [root@dns-server mnt]# sh time.sh

    12345678910

     

    2.

    vim /mnt/daotime.sh

    #!/bin/bash

    for ((i=10;i>=0;i--))

    do

            echo -n $i

            #echo -ne ' \r'

            sleep 1

    done

    sh /mnt/daotime.sh

    [root@dns-server mnt]# sh time.sh

    109876543210

     

    3.1分10秒倒计时脚本

     

    vim /mnt/time.sh

    #!/bin/bash

    MIN=1

    for ((SEC=10;SEC>=0;SEC--))

    do

            echo -n " $MIN:$SEC "

            echo -ne "\r    \r"

            sleep 1

     

            while

            [ "$SEC" = "0" -a "$MIN" -gt "0" ]

            do

                    echo -n  " $MIN:$SEC "

                    echo -ne "\r   \r"

                    SEC=60

                    ((MIN--))

            done

    done

    sh /mnt/time.sh

     

     

     

    ##########test条件判断

    test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式

    true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语

    ,使用方括号"[]"将表达式括起来,这样更易于阅读。

     

    非零或零长度字符串运算符:test -{n|z} STRING

    字符串比较运算符:=、!=

    数字比较运算符:-eq(等于)、-ne(不等于)、-lt(小于)、-le(小于等于)、-gt(大于)、-ge(大于等于)

    文件状态运算符:test -{b|c|e|f|d|r|w|x|s|L} FILE/DIRECTORY

    二进制文件运算符:-ef、-nt、-ot

    逻辑运算符:-o、-a、!、&&、||

     

    ###########if语句##########

    if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then

    之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之

    间的命令列表(反向平写if,标记if块的结束)。

     

    1.

    vim /mnt/ping.sh

    #!/bin/bash

    if

    [ -n "$*" ]

    then

            ping -c1 -w1 $* &> /dev/null

            if

            [ "$?" = "0" ]

            then

            echo $* is up

            else

            echo $* is down

            fi

    else

            echo "ERROR : please give me a ipaddress"

    fi

    sh ping.sh

     

    2.

    vim /mnt/test.sh

    #!/bin/bash

    read -p "please input (Y/N): " yn

     

    if

    [ "$yn" == "Y" -o "$yn" == "y" ]

    then

            echo "OK,continue"

    elif

    [ "$yn" == "N" -o "$yn" == "n" ]

    then

            echo "interrupt!"

    else

            echo "please again input"

    fi

     

    [root@dns-server mnt]# sh test.sh

    please input (Y/N): y

    OK,continue

    [root@dns-server mnt]# sh test.sh

    please input (Y/N): n

    interrupt!

     

    ###################case语句##############

     

    case语句 :它能够把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪

    部分代码。

     

    vim /mnt/cases.sh

    #!/bin/bash

     

    case $1 in

            westos)

            echo linux

            ;;

            linux)

            echo westos

            ;;

            *)

            echo error

    esac

     

    [root@dns-server mnt]# sh cases.sh

    error

    [root@dns-server mnt]# sh cases.sh westos

    linux

    [root@dns-server mnt]# sh cases.sh linux

    westos

     

    ###############expect语句###############

         shell中利用expect实现自动应答脚本。

     

    1.

    [root@dns-server mnt]# vim answes.exp

    [root@dns-server mnt]# chmod +x answes.exp

    [root@dns-server mnt]# /mnt/answes.exp

    spawn /mnt/ask

    what is your name?

    zcc

    how old are you?

    22

    girl\boy?

    boy

    或者

    #!/usr/bin/expect

    spawn /mnt/ask

    expect {

            "name" { send "zcc\r"; exp_continue }

            "old" { send "22\r"; exp_continue }

            "girl" {send "boy\r"; exp_continue }

    expect eof

    }

     

    2.

    #!/usr/bin/expect

    set NAME [ lindex $argv 0 ]

    set AGE  [ lindex $argv 1 ]

    set SEX  [ lindex $argv 2 ]

     

    spawn /mnt/ask

    expect {

            "name" { send "$NAME\r"; exp_continue }

            "how old are you" { send "$AGE\r"; exp_continue }

            "girl" {send "$SEX\r"; exp_continue }

    expect eof

    }

     

    [root@dns-server mnt]# /mnt/answes.exp  zcc 22 boy

    spawn /mnt/ask

    what is your name?

    zcc

    how old are you?

    22

    girl\boy?

    boy

     

    #!/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开始,分别表示第

    一个,第二个,第三个....参数。

     

    #############alias############

    使用别名

    alias命令可以用来自定义属于自己的系统命令,写入~/.bashrc 文件永久生效。

    查看别名:

    # alias

    alias ls='ls --color=auto'

    alias mv='mv -i'

    alias rm='rm -i'

    ...

    设置别名:

    # alias mycom='echo hello;hostname'

    # mycomm

    hello

    server0.example.com

    删除别名: unalias mycomm

     

    ##############花生壳(ddns)##########

     

    [root@apache named]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST westos

    Kwestos.+157+35167

    [root@apache mnt]# cat Kwestos.+157+35167.key

    westos. IN KEY 512 3 157 0cjbgjTKpkgqxfMf2lgDJg==

     

    [root@apache etc]# vim westos.key

    key "westos" {

            algorithm hmac-md5;

            secret "0cjbgjTKpkgqxfMf2lgDJg==";

    };

    [root@apache etc]# vim /etc/named.conf

    include "/etc/westos.key";

    [root@apache etc]# vim /etc/named.rfc1912.zones                 

    zone "westoslinux.com" IN {

            type master;

            file "westoslinux.com.zone";

            allow-update {  key westos; };

            allow-transfer { 172.25.254.247; };

    };

     

    [root@apache named]# vim /etc/dhcp/dhcpd.conf

     

    option domain-name "westoslinux.com";

    option domain-name-servers 172.25.254.147;

     

    default-lease-time 600;

    max-lease-time 7200;

     

    # Use this to enble / disable dynamic dns updates globally.

    ddns-update-style interim;

     

     

    key westos {

            algorithm hmac-md5;

            secret 0cjbgjTKpkgqxfMf2lgDJg==;

    };

     

    zone westoslinux.com. {

            primary 127.0.0.1;

            key westos;

    }

     

     

    转载请注明原文地址: https://ju.6miu.com/read-16254.html

    最新回复(0)