bash脚本

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

 

####引用和转义####

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

##弱引用##

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

##强引用##

将字符串放置在单引号中,保留字符串中所有字符的文字之,同时禁用所有扩展

##转义##

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

[root@dns-server ~]# echo #hello world#

 

[root@dns-server ~]# echo \# hello world #

# hello world

[root@dns-server ~]# echo \# hello world \#

# hello world #

[root@dns-server ~]# echo '# hello world #'

# hello world #

[root@dns-server ~]# echo "# hello world #"

# hello world #

[root@dns-server ~]# echo "$HOME"

/root

[root@dns-server ~]# echo '$HOME'

$HOME

 

算术运算符指的是可以在程序中实现加,减,乘,除等数学运算的运算符。

operator          meaning

<VARIABLE>++       增量后

<VARIABLE>--       减量后

    -               减法

    +               加法

    **              幂运算

    *               乘法

    /               除法

    %               余数

    +=              加等

    -=              加等

 

循环:for循环用于值列表中的相同命令的重复

if语句:if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之间的命令列表(fi代表if块的结束)

 

##将所有mail组的文件复制到/mnt/mail.当前时间的目录中##

#!/bin/bash

TIME=$(date +%H:%M:%S)

find / -group mail -exec cp -rp {} /mnt/mail.${TIME} \;

 

##连接30台主机,能连接的输出up,不能连接的输出down##

#!/bin/bash

for NUM in 172.25.254.{1..30}

do

ping -c1 -w1 $NUM &> /dev/null && echo $NUM up || echo $NUM down

done

 

##将passfile中的密码赋予username中的用户##

#!/bin/bash

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

for NUM in $( seq 1 $MAXLINE )

do

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

        PASSWD=`sed -n ${NUM}p /mnt/passfile`

        useradd $USERNAME

        echo $PASSWD | passwd --stdin $USERNAME

done

 

##先输出十以内的偶数,再输出十以内的奇数##

#!/bin/bash

for i in {1..10}

do

ANSWER=$[ $i % 2 ]

        while

        [ "$ANSWER" = "0" ]

        do

        echo $i

        break

        done

done

echo ================================

for i in {1..10}

do

ANSWER=$[ $i % 2 ]

        while

        [ "$ANSWER" = "1" ]

        do

        echo $i

        break

        done

done

 

##username中用户lee后加brother##

一:

!/bin/bash

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

for NUM in $( seq 1 $MAXLINE )

do

        NAME=`sed -n ${NUM}p /mnt/username`

        while

        [ "$NAME" = "lee" ]

        do

        echo $NAME brother

        break

        done

        while

        [ "$NAME" != "lee" ]

        do

        echo $NAME

        break

        done

done

 

二:

#!/bin/bash

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

for NUM in $( seq 1 $MAXLINE )

do

        NAME=`sed -n ${NUM}p /mnt/username`

        [ "$NAME" = "lee" ] && echo $NAME brother || echo $NAME

done  

 

 

##十秒倒计时##

#!/bin/bash

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

do

echo -n After ${i}s is end

echo -ne ' \r'

sleep 1

done

 

##一分十秒倒计时##

#!/bin/bash

MIN=$1

for ((SEC=$2;SEC>=0;SEC--))

do

        echo -n "After $MIN:$SEC  is end "

        echo -ne "\r    \r"

        sleep 1

 

        while

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

        do

                echo -n "After $MIN:$SEC  is end "

                echo -ne "\r    \r"

                SEC=60

                ((MIN--))

        done

 

done

 

##连接ip##

#!/bin/bash

if

        [ -z "$*" ]  ##检测命令后是否给予字符串

then

        echo ERROR:you not give me a ipaddress ##如果没有,报错

else

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

        if

                [ "$?" = "0" ]

        then

                echo $* is up  ##能够ping通,显示up

        else

                echo $* is down  ##不能ping通,显示down

        fi

fi

 

##判断数字是否是10以内的正数##

#!/bin/bash

if

        [ $1 -gt 0 -a $1 -le 10 ]

then

        echo yes

else

        echo noet IP [ lindex $argv0 ]

set PASS [ lindex $argv1 ]

spawn ssh root@$IP

expect {

        "yes/no" {send "yes\r"; exp_continue }

        "password" {send "$PASS\r"}

        }

interact

 

fi

 

-gt ##大于

-ge ##大于等于

-lt ##小于

-le ##小于等于

-ne ##不等于

-eq ##等于

-ef ##看两文件的节点是否一致

-nt ##看前一个文件是否比后一个文件新

-ot ##看前一个文件是否比后一个文件老

 

##elif的运用##

输入linux则输出westos,输入westos则输出linux

#!/bin/bash

if

        [ "$*" = "linux" ]

then

        echo westos

elif

        [ "$*" = "westos" ]

then

        echo linux

else

        echo ERROR

fi

 

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

##case的运用##

case $1 in

        westos)

        echo linux

        ;;

        linux)

        echo westos

        ;;

        *)

        echo error

esac

 

 

##expect自动应答##

vim ask.sh

##################################################

#!/bin/bash

read -p "what is your name:" NAME

read -p "how old are you: " AGE

read -p "what is your class:" CLASS

read -p "are you happy : " FEEL

echo $NAME is $AGE\'s old $NAME is $CLASS student and $FEEL

#################################################

chmod +x ask.sh

 

vim answer.exp

########################

#!/usr/bin/expect

spawn /mnt/ask.sh

        expect "name"

        send "haha\r"

        expect "old"

        send "22\r"

        expect "class"

        send "yunwei\r"

        expect "happy"

        send "unhappy\r"

        expect eof

##########################

chmod +x anser.exp

 

 

 

##退出状态##

linux命令完成时,将返回推出状态。成功完成程序,将返回0的推出状态。非零退出状态通常表示发生了错误。

example:

grep的退出状态的含义:

0   在指定的文件中找到了模式

1   在指定的文件中未找到模式

>1  一些其他错误(无法打开文件、错误的搜索表达式等)

 

##设置环境变量##

vim test.sh

#!/bin/bash

echo $a

vim .bash_profile

PATH=$PATH:$HOME/bin:/mnt

 

export PATH

export a=1

source .bash_profile

 

vim /etc/profile

77 export PATH=$PATH:/mnt

78 export a=2

source /etc/profile    ##使环境变量生效

 

 

##判断后缀为文件,目录或设备##

#!/bin/bash

IFCMD () {

        if

        [ $1 $2 ]

        then

        echo $2 is $3

        fi

}

IFCMD -f $1 file

IFCMD -d $1 direcotry

IFCMD -b $1 block

 

 

 

username,passfile行数不一致,报错,用户存在,提示

#!/bin/bash

if [ -f /mnt/username -a -f /mnt/passfile ]        ##判断是否为文件

then

        USERLINE=`wc -l /mnt/username |cut -d " " -f 1`

        PASSLINE=`wc -l /mnt/passfile |cut -d " " -f 1`

        [ $USERLINE -eq $PASSLINE ] &&(            ##判断行数是否一致

        for i in $( seq 1 $USERLINE )

        do

                USERNAME=`sed -n ${i}p /mnt/username`

                PASSWORD=`sed -n ${i}p /mnt/passfile`

                USER=`getent passwd $USERNAME`

                [ "$?" = "0" ]&&                   ##判断用户是否存在

                        (useradd $USERNAME

                        echo $PASSWORD | passwd --stdin $USERNAME

                )||echo "$USERNAME is exist"

                done

                )|| echo "different line"

else

        echo "it is not a exit"

fi

 

连接ip

#!/usr/bin/expect

set USER [ lindex $argv 0 ]

set IP [ lindex $argv 1 ]

set PASS [ lindex $argv 2 ]

spawn ssh "$USER@$IP"

expect {

        "yes/no" { send "yes\r"; exp_continue }

        "password:" { send "$PASS\r"; exp_continue }

        }

interact

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值