第九次笔记

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;

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值